删除老式终结器

时间:2014-03-23 12:03:45

标签: c# memory-management garbage-collection finalizer disposable

在一个差不多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方法。有任何原因来保持终结者吗?没有任何对象使用非托管资源,所以我很确定我不会遇到资源泄漏。正确?

1 个答案:

答案 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