在.NET中使用后将对象设置为Null / Nothing
一旦你完成了它们,你应该把所有的对象都设置为null
(VB.NET中Nothing
)?
我明白,在.NET中,处理实现IDisposable
接口的对象的任何实例都是必要的,以释放一些资源,尽管该对象在处置后仍然是某些东西(因此表单中的isDisposed
属性),所以我认为它可以仍然驻留在记忆中或至少部分?
我也知道,当一个对象超出范围时,它会被标记为垃圾收集器的下一个传递的收集(尽管这可能需要时间)。
因此,考虑到这一点,将它设置为null
加快系统释放内存的速度,因为它不必解决它不在范围内,并且它们有任何不良副作用?
MSDN文章从来没有在例子中做到这一点,目前我这样做,因为我不能看到伤害。 不过,我遇到了各种意见,所以任何意见都是有用的。
Karl绝对正确,使用后不需要将对象设置为null。 如果一个对象实现了IDisposable
,只要确保在完成该对象(包装在try
... finally
或using()
块)中时调用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?