因此,默认的处置模式实现如下所示:
class SomeClass : IDisposable
{
// Flag: Has Dispose already been called?
bool disposed = false;
// Public implementation of Dispose pattern callable by consumers.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing) {
// Free any other managed objects here.
}
// Free any unmanaged objects here.
disposed = true;
}
~SomeClass()
{
Dispose(false);
}
}
据说:
如果方法调用来自终结器(即,如果处置是
false
),则仅执行释放非托管资源的代码。由于未定义垃圾收集器在终结期间销毁托管对象的顺序,因此Dispose
使用值调用此重载false
可防止终结器尝试释放可能已被回收的托管资源。
问题是:为什么假设被 object of 引用的对象SomeClass
可能已经被释放,我们不应该在从 finalizer 调用方法时尝试释放它们?如果那些对象仍然被我们的SomeClass
对象引用,它们就不能被释放,不是吗?据说:
那些有挂起(未运行)终结器的(暂时)保持活动状态,并被放入一个特殊的队列中。[...] 在每个对象的终结器运行之前,它仍然非常活跃——该队列充当根 对象。
因此,我们的SomeClass
对象再次被该队列引用(这与被根引用相同)。对象引用的其他对象SomeClass
也应该是活动的(因为它们是通过SomeClass
对象生根的)。那么为什么以及如何在SomeClass
调用终结器时释放它们呢?
慕斯王
慕的地10843
相关分类