首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在.NET中使用后将对象设置为Null/Nothing

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

Stack Overflow用户
提问于 2008-08-05 20:14:11
回答 11查看 102.6K关注 0票数 191

处理完所有对象后,是否应将它们设置为null (VB.NET中的Nothing)?

我知道在.NET中,有必要释放实现IDisposable接口的对象的任何实例,以释放一些资源,尽管对象在被释放后仍然可以是一些东西(因此表单中的isDisposed属性),所以我假设它仍然可以驻留在内存中,或者至少部分驻留在内存中?

我还知道,当一个对象超出作用域时,它会被标记为回收,为垃圾收集器的下一次传递做好准备(尽管这可能需要时间)。

因此,考虑到这一点,将其设置为null是否会加快系统释放内存的速度,因为它不必计算出它不再在作用域中,它们是否有任何坏的副作用?

MSDN文章从来不会在示例中这样做,目前我这样做是因为我看不到它的危害。然而,我遇到了各种各样的意见,所以任何评论都是有用的。

EN

回答 11

Stack Overflow用户

发布于 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,所以这两位代码最终是相同的。

票数 37
EN

Stack Overflow用户

发布于 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不会做任何事情,只会弄脏您的代码。

票数 13
EN

Stack Overflow用户

发布于 2008-08-09 11:16:05

一般来说,没有必要在使用后将对象设为空,但在某些情况下,我发现这是一个很好的做法。

如果一个对象实现了IDisposable并存储在一个字段中,我认为最好将它设为空,这样可以避免使用disposed对象。以下类型的bug可能会令人痛苦:

this.myField.Dispose();
// ... at some later time
this.myField.DoSomething();

最好在处理字段后将其设为空,并在再次使用该字段的行处获取一个NullPtrEx。否则,您可能会遇到一些神秘的bug (取决于DoSomething到底做了什么)。

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

https://stackoverflow.com/questions/2785

复制
相关文章

相似问题

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