从终结器

时间:2016-03-31 21:37:03

标签: c# .net garbage-collection

我正在开发一个类,我必须处理托管和非托管资源,看起来像这样(显然只有处置部分):

class MyDisposingExample : IDisposable
{
    public void Dispose()
    {
        Dispose(true);
    }

    private void Dispose(bool callFromDispose)
    {
        // free unmanaged resources here
        if (callFromDispose)
        {
            // free managed resources here
            GC.SuppressFinalize(this);
        }
    }

    ~MyDisposingExample()
    {
        Dispose(false);
    }
}

然后我想到了一个念头。为什么要打扰第二个Dispose函数?为什么我不能这样做:

class MyDisposingExample2 : IDisposable
{
    public void Dispose()
    {
        // free unmanaged resources here
        // free managed resources here
        GC.SuppressFinalize(this);
    }

    ~MyDisposingExample2()
    {
        Dispose();
    }
}

通常的处理模式解决了几个问题,所有这些问题似乎都是通过这个例子解决的,没有额外的方法。

1)如果显式调用Dispose()方法,它将释放托管资源,非托管资源并禁止终结器,以便以后再次释放资源。

2)如果没有明确调用方法Dispose(),终结器将运行Dispose(),免费托管资源,释放非托管资源并禁止终结器(我们稍后会回到这一点)。 / p>

从表面上看,这种模式提供了之前模式所做的一切。如果我不再需要它,我可以明确地处理我的对象,如果我忘记自己处理它并且不用担心资源被释放两次,我的对象就会被隐瞒。

美中不足的似乎是我在终结器本身内调用GC.SuppressFinalize(),但是......为什么不呢? According to MSDN

  

此方法在obj的对象标头中设置一个位,运行时在调用终结器时进行检查。

所以我所做的就是设置一下。一旦它被运行,这不应该影响终结器,因为在调用终结器之前必须进行位检查。

由于我没有在任何地方看到这种模式,我必须假设它有问题。我错过了什么?

0 个答案:

没有答案