这不是直接的 PowerShell 问题。当一个using
块终止时,指定的对象会Dispose()
调用它们的方法。这些通常会执行一些清理操作,通常是为了避免内存泄漏等。但是,Dispose()
不会删除对象。如果对它的引用仍然存在于using
块之外(如本例所示),则对象本身仍在范围内。它不能被垃圾收集,因为仍然有对它的引用,所以它仍然占用内存。
他们在您的示例中所做的是删除该引用。当powershell
设置为 null 时,它指向的 PowerShell 对象是孤立的,因为没有其他变量引用它。一旦垃圾收集器发现了这一点,它就可以释放内存。无论如何,这将在方法结束时发生(因为powershell
会超出范围),但是这样您可以更快地恢复系统资源。
(编辑:正如 Brian Rasmussen 指出的那样,.NET 运行时在垃圾收集方面非常聪明。一旦到达powershell
代码中的最后一个引用,运行时应该检测到您不再需要它并将其释放以进行垃圾收集。所以这powershell = null;
条线实际上并没有做任何事情。)
顺便说一句,这种模式对我来说看起来很奇怪。通常的方法是这样的:
using (PowerShell powershell = PowerShell.Create())
{
//...
}
这样,在块的末尾,就在它被处理之后,powershell
就超出了范围。using
更容易判断变量的相关性,并且您节省了一些代码,因为您不再需要该powershell = null
行。我什至会说这是更好的编码实践,因为powershell
永远不会以已经处置的状态存在。如果有人修改了您的原始代码并尝试powershell
在块之外使用,那么using
无论发生什么都可能是坏事。