处理完所有对象后,是否应将它们设置为null
(VB.NET中的Nothing
)?
我知道在.NET中,有必要释放实现IDisposable
接口的对象的任何实例,以释放一些资源,尽管对象在被释放后仍然可以是一些东西(因此表单中的isDisposed
属性),所以我假设它仍然可以驻留在内存中,或者至少部分驻留在内存中?
我还知道,当一个对象超出作用域时,它会被标记为回收,为垃圾收集器的下一次传递做好准备(尽管这可能需要时间)。
因此,考虑到这一点,将其设置为null
是否会加快系统释放内存的速度,因为它不必计算出它不再在作用域中,它们是否有任何坏的副作用?
MSDN文章从来不会在示例中这样做,目前我这样做是因为我看不到它的危害。然而,我遇到了各种各样的意见,所以任何评论都是有用的。
发布于 2008-08-15 14:43:35
在使用对象时避免将它们设置为null的另一个原因是,这实际上可以让它们存活更长时间。
例如:
void foo()
{
var someType = new SomeType();
someType.DoSomething();
// someType is now eligible for garbage collection
// ... rest of method not using 'someType' ...
}
将允许在调用"DoSomething“之后对someType引用的对象进行GC,但是
void foo()
{
var someType = new SomeType();
someType.DoSomething();
// someType is NOT eligible for garbage collection yet
// because that variable is used at the end of the method
// ... rest of method not using 'someType' ...
someType = null;
}
有时可能会使对象保持活动状态,直到方法结束。JIT will usually optimized away the assignment to null,所以这两位代码最终是相同的。
发布于 2008-08-05 20:23:33
不,不要将对象设为空。您可以查看https://web.archive.org/web/20160325050833/http://codebetter.com/karlseguin/2008/04/28/foundations-of-programming-pt-7-back-to-basics-memory/以了解更多信息,但是将内容设置为null不会做任何事情,只会弄脏您的代码。
发布于 2008-08-09 11:16:05
一般来说,没有必要在使用后将对象设为空,但在某些情况下,我发现这是一个很好的做法。
如果一个对象实现了IDisposable并存储在一个字段中,我认为最好将它设为空,这样可以避免使用disposed对象。以下类型的bug可能会令人痛苦:
this.myField.Dispose();
// ... at some later time
this.myField.DoSomething();
最好在处理字段后将其设为空,并在再次使用该字段的行处获取一个NullPtrEx。否则,您可能会遇到一些神秘的bug (取决于DoSomething到底做了什么)。
https://stackoverflow.com/questions/2785
复制相似问题