在.NET中使用后将对象设置为Null / Nothing

一旦你完成了它们,你应该将所有的对象设置为 null ( Nothing )

我明白,在.NET中,处理实现 IDisposable 接口的对象的任何实例都是必不可少的,以释放一些资源,尽管该对象在处置后仍可能是某种东西(因此 isDisposed 属性),所以我认为它仍然可以驻留在内存中或至少部分?

我也知道,当一个对象超出范围时,它会被标记为垃圾收集器的下一个传递的收集(尽管这可能需要时间)。

因此,考虑到这一点,将它设置为 null 可以加快系统释放内存的速度,因为它不必处理它不在范围内,并且它们有任何不良副作用?

MSDN文章从来没有在例子中做到这一点,目前我这样做,因为我不能 看到伤害。不过,我遇到了各种意见,所以任何意见都是有用的。

0
额外 编辑
意见: 1
+1很好的问题。有没有人知道编译器将完全优化分配的情况?即有人在不同情况下查看MSIL,并注意到IL将对象设置为空(或缺少)。
额外 作者 Tim Medora,

3 答案

只有当变量没有超出范围并且不再需要与其关联的数据时,您才应该将变量设置为null。否则就没有必要。

0
额外
这是真的,但这也意味着你应该重构你的代码。我不认为我曾经需要声明一个超出预期范围的变量。
额外 作者 Karl Seguin,
如果“变量”被理解为包含对象字段,那么这个答案很有意义。在“变量”仅表示“方法”的“局部变量”的情况下,那么我们可能在这里谈论利基案例(例如,运行时间比平常长得多的方法)。
额外 作者 stakx,

某些对象假设强制将资源从内存中移除的 .dispose()方法。

0
额外
铭记的决定仅适用于被管理的资源,而不是那些非托管(即内存)
额外 作者 nicodemus13,
不,它不; Dispose()不会收集对象 - 它用于执行确定性清理,通常释放非托管资源。
额外 作者 Marc Gravell,

不要不空对象。您可以查看 http://codebetter.com/blogs/karlseguin/archive/2008/04/27/foundations-of-programming-pt-7-back-to-basics-memory.aspx 了解更多信息,但将事情设置为空将不会执行任何操作,除非脏代码。

0
额外
有关共享链接中内存的细节和详细说明
额外 作者 user2323308,