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