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

一旦你完成了它们,你应该把所有的对象都设置为null (VB.NET中Nothing )?

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

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

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

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


Karl绝对正确,使用后不需要将对象设置为null。 如果一个对象实现了IDisposable ,只要确保在完成该对象(包装在try ... finallyusing()块)中时调用IDisposable.Dispose() )。 但即使您不记得调用Dispose() ,对象的终结器方法也应该为您调用Dispose()

我认为这是一个很好的待遇:

挖入IDisposable

和这个

了解IDisposable

试图第二次猜测GC及其管理策略是没有意义的,因为它是自我调整和不透明的。 关于在Dot Net Rocks上与Jeffrey Richter的内部工作进行了很好的讨论:Windows存储器模型的Jeffrey Richter和C#第20章的CLR book CLR有一个很好的处理:


避免将对象设置为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'd处理,但是

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通常会将赋值优化为空,因此这两个代码最终都是相同的。


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

链接地址: http://www.djcxy.com/p/54525.html

上一篇: Setting Objects to Null/Nothing after use in .NET

下一篇: Memory leak problems: dispose or not to dispose managed resources?