在一个差不多10年的系统中,我实现了几个IDisposable
实现。回到过去,当我年轻时仍然愚蠢时,趋势是实现终结者:
class MyClass: IDisposable
{
public void Dispose() { Dispose(true); }
~MyClass { Dispose(false); }
private void Dispose(bool bDisposing)
{
... dipose ...
if(bDisposing)
GC.SupressFinalize(this);
}
}
最后,经过近十年,这就是我们 - Dispose方法在从终结器调用时抛出异常,并且该进程意外死亡并且没有警告。
我想删除所有终结器,并只保留将处理资源的Dispose
方法。有任何原因来保持终结者吗?没有任何对象使用非托管资源,所以我很确定我不会遇到资源泄漏。正确?
答案 0 :(得分:2)
关于何时需要终结者的一般建议是:几乎从不。请参阅Eric Lippert对以下问题的回答:
When should I create a destructor?
您的应用程序是否会泄漏取决于许多事情。但是,如果您没有非托管资源,而且您对处理应该处理的类很好,那么您就不应该有泄漏。
在上面的评论中,关于遇到终结器在一个没有完全构造的对象上运行的问题:这是终结器可能是危险的部分原因之一。编写正确的终结器是一件非常困难的事情。如果您确实拥有必须始终清理的资源,那么您应该使用SafeHandle:
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.safehandle(v=vs.110).aspx