2

在一个将近 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 方法在从 finalizer 调用时抛出了一个异常,并且该进程在没有任何警告的情况下意外死亡。

我想删除所有终结器,只保留Dispose将处理资源的方法。有什么理由保留终结者吗?没有一个对象使用非托管资源,所以我很确定我不会得到资源泄漏。正确的?

4

1 回答 1

2

关于何时需要终结器的一般建议是:几乎从不。请参阅 Eric Lippert 对以下问题的回答:

我应该什么时候创建析构函数?

您的应用程序是否会有泄漏取决于很多事情。但是,如果您没有非托管资源,并且您擅长处理应该处理的类,那么您就不应该有泄漏。

在您上面关于遇到终结器在未完全构造的对象上运行的问题的评论中:这是终结器可能是危险事物的部分原因。编写一个正确的终结器是一件非常困难的事情。如果您确实有必须始终清理的资源,则应该使用 SafeHandle:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.safehandle(v=vs.110).aspx

于 2014-03-23T12:22:08.343 回答