Microsoft 的 Cmdlet 开发“必需的开发指南”在此处声明 Cmdlet 不应保留输出对象的句柄。
然而,当开发一个对管道输入执行副作用的 cmdlet 时,它可能会或可能不会修改输入对象的状态,可以通过 WriteObject 方法将输入对象通过管道传输到输出管道,以促进进一步的命令链接。由于管道输入参数是一个输入对象类型的数组,它仍然会保留对该对象的引用。
这种行为会破坏开发合同并导致问题吗?
Microsoft 的 Cmdlet 开发“必需的开发指南”在此处声明 Cmdlet 不应保留输出对象的句柄。
然而,当开发一个对管道输入执行副作用的 cmdlet 时,它可能会或可能不会修改输入对象的状态,可以通过 WriteObject 方法将输入对象通过管道传输到输出管道,以促进进一步的命令链接。由于管道输入参数是一个输入对象类型的数组,它仍然会保留对该对象的引用。
这种行为会破坏开发合同并导致问题吗?
在您的情况下,我会说您实际上并没有保留对该对象的引用。PowerShell 使用 InputObject 属性(InputObject 参数)将对象传递给您,但 PowerShell 维护的是该引用,而不是您。
如果您引用的规则在您的代码上触发,您可以提出建议以改进对这种错误情况的检测。
稍微改一下规则——一旦你调用了WriteObject,你就不应该再使用那个对象了。如果你有参考,你可以参考它。您可以通过几种有趣的方式保留参考:
如果对对象的最后引用是您对 WriteObject 的调用,则局部变量很好。如果非静态字段用于实现 cmdlet 的参数,它们应该没问题。静态字段可能是个问题。