首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在释放对象后需要将此变量设置为null?

为什么在释放对象后需要将此变量设置为null?
EN

Stack Overflow用户
提问于 2013-05-15 21:36:37
回答 3查看 3.4K关注 0票数 14

有关PowerShell here的文档中有以下有趣的注释:

代码语言:javascript
复制
PowerShell powershell = PowerShell.Create();

using (powershell)
{
    //...
}

// Even after disposing of the PowerShell object, we still 
// need to set the powershell variable to null so that the 
// garbage collector can clean it up.
powershell = null;

为什么powershell需要在释放后设置为null

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-16 00:31:47

这不是一个直接的PowerShell问题。当using块终止时,将调用指定对象的Dispose()方法。它们通常会执行一些清理操作,通常是为了避免内存泄漏等。但是,Dispose()不会删除该对象。如果对它的引用仍然存在于using块之外(如本例所示),则该对象本身仍在作用域内。它不能被垃圾收集,因为仍然有对它的引用,所以它仍然占用内存。

他们在你的例子中所做的就是删除这个引用。当powershell设置为null时,它所指向的PowerShell对象是孤立的,因为没有其他变量引用它。一旦垃圾收集器发现了这一点,它就可以释放内存。这无论如何都会在方法结束时发生(因为powershell会超出作用域),但是通过这种方式,您可以更快地获得系统资源。

(__编辑:正如Brian Rasmussen所指出的,.NET运行时在垃圾收集方面非常聪明。当它到达代码中对powershell的最后一个引用时,运行库应该检测到您不再需要它,并将其释放以进行垃圾回收。因此,powershell = null;行实际上并没有做任何事情。)

顺便说一下,这个模式对我来说非常奇怪。通常的方法是这样的:

代码语言:javascript
复制
using (PowerShell powershell = PowerShell.Create())
{
   //...
}

这样,在using块被释放之后,powershell就会在它的末尾超出作用域。更容易辨别变量的相关位置,并且节省了一些代码,因为您不再需要powershell = null行。我甚至认为这是更好的编码实践,因为powershell永远不会以已经释放的状态存在。如果有人修改了您的原始代码,并试图在using块之外使用powershell,那么无论发生什么情况都可能很糟糕。

票数 17
EN

Stack Overflow用户

发布于 2013-05-16 01:15:09

它不需要设置为null,也不应该设置为null。即使您的代码没有为相应的变量分配空值,.NET垃圾收集器也能够很好地检测到某个对象在特定指令之后没有被使用。(详细信息请参见http://blogs.msdn.com/b/cbrumme/archive/2003/04/19/51365.aspx。)至于为什么“官方”示例包含这些带有误导性注释的额外代码,即使是文档也会有bug……

票数 6
EN

Stack Overflow用户

发布于 2013-05-17 02:38:31

这个通知是不正确的,只要它不能到达,它就有资格进行垃圾收集。(有关演示这一点的一些代码,请参阅What is the correct way to free memory in C# )将内容设为空的唯一原因是

  • 使解决内存泄漏问题变得更容易
  • 删除GC可能难以确定是否无法访问的引用(例如公共属性)

这两种方法实际上只能在对象的Dispose方法中完成

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16566552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档