我为代码使用默认的IDisposable实现模板(模式)。

片段:

public void Dispose()
{
    Dispose(true);

    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool isDisposing)
{
    if (!this.disposed)
    {
        if (isDisposing)
        {
            //cleanup managed resources
        }

        //cleanup unmanaged resources

        this.disposed = true;
    }
}

我的问题:为什么在Dispose公共(public)方法中调用“GC.SuppressFinalize(this)”?处置托管资源后,将“GC.SuppressFinalize(this)”放置在 protected 方法的“if(isDispose)”部分中。

像这样:
protected virtual void Dispose(bool isDisposing)
{
    if (!this.disposed)
    {
       if (isDisposing)
       {
           //cleanup managed resources

           GC.SuppressFinalize(this);
       }

       //cleanup unmanaged resources

       this.disposed = true;
    }
}

最佳答案

我认为它是“模板设计”模式的明确案例。

您的抽象类经过精心设计,可以处理所有必需的重要/必要任务(在此处,GC.SuppressFinalize(this)),并允许派生类仅覆盖部分代码。

这里有2种情况:
片段1,SuppressFinalize,在Dispose中
片段2,SuppressFinalize,在Dispose中(true)

在这里,代码段1确保始终执行GC.SuppressFinalize。在代码段2中,保留了GC.SuppressFinalize的执行,但要靠派生类来代替。

因此,通过将GC.SuppressFinalize放入Dispose方法中,作为类的设计者,您将始终确保无论派生类编写的代码如何,都将执行GC.SuppressFinalize。

这只是在Dispose中编写SuppressFinalize而不是Dispose(true)的好处。

10-04 17:04