每当我在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);
}
}
答案 0 :(得分:2)
GC.SupressFinalizer()不会阻止对象在不再可用时被收集,它只会抑制对对象终结器的调用。因此,无论您是否分配null,都将收集您的对象及其成员。
答案 1 :(得分:1)
IDisposable.Dispose的目的是通知一个对象它不再需要它,并且应该告诉其他对象它们不再需要代表它做任何事情(例如保持文件打开,授予独占权)访问一块内存等。)大多数时候,在一个对象Dispose之后不久,任何对它的引用都将被放弃,该对象将有资格进行垃圾收集,并且它对其他对象的引用不会延迟他们的垃圾收集。尽管如此,清除其他参考文献可能是一个好主意。完全可能在调用Dispose之后很久就会有一个引用保留在对象上。此外,IDisposable对象可能已经存在足够长的时间以到达垃圾收集器中的第2代,这意味着垃圾收集器可能需要一段时间才能再次查看它。如果它保存对最近创建的对象的引用,则将其引用设置为null可能会允许更快地收集这些对象。