任何意义在Dispose()中设置obj = null(Nothing)?
在Dispose()
方法中将自定义对象设置为null
(在VB.NET中为Nothing
)是否有意义? 这可以防止内存泄漏或无用?!
我们来看两个例子:
public class Foo : IDisposable
{
private Bar bar; // standard custom .NET object
public Foo(Bar bar) {
this.bar = bar;
}
public void Dispose() {
bar = null; // any sense?
}
}
public class Foo : RichTextBox
{
// this could be also: GDI+, TCP socket, SQl Connection, other "heavy" object
private Bitmap backImage;
public Foo(Bitmap backImage) {
this.backImage = backImage;
}
protected override void Dispose(bool disposing) {
if (disposing) {
backImage = null; // any sense?
}
}
}
Dispose()
的目的是清理垃圾收集器不处理的资源。 对象由GC处理,所以在正常情况下,实际上不需要将引用设置为null。
例外情况是,如果您希望调用者调用Dispose
并在此之后继续执行该实例。 在这种情况下,将内部引用设置为null可能是一个好主意。 但是,一次性实例通常是同时处置和释放的。 在这些情况下,它不会产生很大的影响。
我个人倾向于; 有两个原因:
Foo
(可能来自事件),仍然可以收集任何下游对象(在这种情况下为Bitmap
)(在将来的某个时刻 - 只要GC感觉如此)。 这可能仅仅是一个非托管资源的浅层包装,但每一点都有帮助。 IDisposable
是一个方便的“几乎杀人”的开关 - 为什么不分离一切可用? ObjectDisposedException
如果它是null
这只是无用的。 在旧的COM / VB日期中设置为NULL,我相信会减少引用计数。
.NET不适用。 当你将bar设置为null时,你不会销毁或释放任何东西。 您只需将对象指向的内容从对象改为“null”即可。 你的对象仍然存在(尽管现在,因为没有指向它,它最终将被垃圾收集)。 除了少数例外情况,并且在大多数情况下,如果您没有首先制作Foo IDisposable,就会发生同样的情况。
IDisposable的主要目的是允许你释放非托管资源,如TCP套接字或SQL连接,或其他。 这通常通过调用非托管资源提供的清理函数来完成,而不是通过将引用设置为“null”来完成。
链接地址: http://www.djcxy.com/p/54521.html