首先在这个 MSDN 页面
有一个标准的 Dispose 模式。并且有一个bool作为protectedDispose
方法的参数来告诉GC是否已经手动释放了托管资源,这样GC就不需要关心它们了。
现在的问题是,在块内究竟应该做什么if (disposing) {}
?通常 GC 会清理托管资源,因此不需要做任何特别的事情。但是由于在这个块内,需要显式清理托管资源,这是否意味着只需将对象中的所有字段和内容设置为null
?
其次,语言中只有一个析构函数(或它所称的终结器)不是更好吗?然后在 GC 设计中,只需要确定析构函数是否已经被调用,因此不需要对其进行垃圾收集,或者析构函数尚未调用,GC 应该清理它。我发现 Dispose 模式相当复杂,我很困惑在哪个函数中清理什么以及如何在派生类中清理。并且通过使用signle析构函数设计,GC只是在它们还没有清理的时候清理它们,并且在它们已经清理的时候不清理。
问候
PS:那么这也是清理对象的一种更好更简单的模式吗?
class Foo
{
bool unmanagedDisposed = false;
void Dispose() {/*clean up unmanaged resources*/ unmanagedDisposed = true;}
~Foo() {if (!unmanagedDisposed) Dispose();}
}
所以如果程序员知道并记得调用Dispose()
,在终结器中什么都不做,否则在终结器中清理非托管资源。在这里,我们不需要关心那些托管资源。