任何意义在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

    上一篇: Any sense to set obj = null(Nothing) in Dispose()?

    下一篇: Instance method call Dispose