【发布时间】:2013-01-11 21:36:26
【问题描述】:
有一个标准的 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(),在终结器中什么都不做,否则在终结器中清理非托管资源。在这里我们不需要关心那些托管资源。
【问题讨论】:
-
阅读这篇精彩的文章以全面了解 Dispose 模式。 codeproject.com/Articles/29534/… 初读相当复杂,但很有启发性。
-
想象你的一个类管理资源本身实现了
IDisposable。你认为你应该在哪里打电话给Dispose()?
标签: c# destructor dispose finalizer