在将近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方法。是否有任何理由让最终定稿者留在身边?没有一个对象使用非托管资源,所以我很确定我不会资源泄漏。对?

最佳答案

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

When should I create a destructor?

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

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

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

关于c# - 删除老式的终结器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22590634/

10-11 01:01