一次性模式:当GC.SupressFinalizer时,我应该循环变量吗?



每当我在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);
    }
}

GC.SupressFinalizer()不会在对象无法访问时阻止对象被收集,它只会抑制对对象终结器的调用。所以无论你是否赋值null,你的对象和它的成员都将被收集

一次性使用的目的。处理通知对象,它不再需要,也应该告诉其他对象,他们不再需要做任何事情在其代表(如敞开文件,授予独家访问一块内存,等等)。在大多数情况下,一个对象处理后不久,任何引用将被遗弃,对象将成为垃圾收集符合条件,及其控股对其他对象的引用不会推迟他们的垃圾收集。尽管如此,清除其他引用可能是个好主意。在调用Dispose之后很长一段时间内,对对象的引用完全有可能保持不变。此外,IDisposable对象可能已经存在了足够长的时间,可以到达垃圾收集器中的第2代,这意味着垃圾收集器可能需要一段时间才能再次查看它。如果它保存了对最近创建的对象的引用,那么将其引用设置为null可以使这些对象被更快地收集。

最新更新