IDisposable模式:我应该在GC.SupressFinalizer时消除变量

时间:2011-12-21 13:38:56

标签: garbage-collection idisposable finalizer

每当我在Dispose方法中调用GC.SupressFinalizer()时, 我应该为所有实例成员分配null以清除它们,还是在任何情况下它们都会被删除?

例如:

class test : IDisposable
{ 
    public int a = 10;
    public int b = 20;
    public int c = 39;

    private bool is_disposed = false;

    Dispose(bool shall_dispose)
    {
        if(!is_disposed && shall_dispose)
        {
            is_disposed = true;

            // shall I annulate a, b & c or they will be freed anyway??
            // a = null; ?, integers aint nullable 
            // b = null; ?
            // c = null; ?

            // or primitive types should't be annulated? only reference(heap) types?
        }
    }

    Dispose()
    {
        Dispose(true);
    }

    ~test()
    {
        Dispose(false);
    }
}

2 个答案:

答案 0 :(得分:2)

GC.SupressFinalizer()不会阻止对象在不再可用时被收集,它只会抑制对对象终结器的调用。因此,无论您是否分配null,都将收集您的对象及其成员。

答案 1 :(得分:1)

IDisposable.Dispose的目的是通知一个对象它不再需要它,并且应该告诉其他对象它们不再需要代表它做任何事情(例如保持文件打开,授予独占权)访问一块内存等。)大多数时候,在一个对象Dispose之后不久,任何对它的引用都将被放弃,该对象将有资格进行垃圾收集,并且它对其他对象的引用不会延迟他们的垃圾收集。尽管如此,清除其他参考文献可能是一个好主意。完全可能在调用Dispose之后很久就会有一个引用保留在对象上。此外,IDisposable对象可能已经存在足够长的时间以到达垃圾收集器中的第2代,这意味着垃圾收集器可能需要一段时间才能再次查看它。如果它保存对最近创建的对象的引用,则将其引用设置为null可能会允许更快地收集这些对象。