CA1063 修改 Dispose() 以便它调用 Dispose(true),然后在当前对象实例上调用 GC.SuppressFinalize,然后调用 returns

CA1063 Modify Dispose() so that it calls Dispose(true), then calls GC.SuppressFinalize on the current object instance and then returns

我有这个class:

public abstract class ImplementsIDisposable : IDisposable
{
    public abstract void Dispose();

    private class InnerClass : ImplementsIDisposable
    {
        private bool disposedValue;

        public override void Dispose()
        {
            if (!disposedValue)
            {
                doSomething();
                disposedValue = true;
            }

            GC.SuppressFinalize(this);
        }
    }
}

代码分析抛出此消息:

CA1063 Modify Dispose() so that it calls Dispose(true), then calls GC.SuppressFinalize on the current object instance and then returns.

还有这个:

CA1063 Ensure that Dispose() is declared as public and sealed.

都在这一行:

public abstract void Dispose();

难不成是想让Dispose()实现在ImplementsIDisposable而不是InnerClass

没有理由 public Dispose() 应该是虚拟的而不是抽象的。

您需要检查 dispose 模式 并正确实施它。这些警告提示您应该如何操作,但除非您知道该模式是如何开始的,否则它们可能会相当含糊。

你可以阅读 Dispose 模式 here,它很简单。

当然,不要错过 this canonical SO answer 这个主题。

我试图遵循已接受的答案,但我将 运行 挡在了墙上,因为我的方法的最后两行确实是 Dispose(true) 和 GC.SupressFinalize(this)。结果警告并没有让我明白这些应该是方法中的 ONLY 行,留下了类似下面的内容。我相信接受的答案中的第一个 link 实际上确实解释了这种差异,但我没有像我应该的那样仔细阅读它。

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    try
    {
        if (disposing)
        {
            // call Dispose on all your disposable fields/properties
        }
    }
    finally
    {
        // free all unmanaged resources here.  Note that this is not in an else block.
    }
}

感谢 https://netvignettes.wordpress.com/2011/06/29/how-to-implement-dispose-properly/ 让我走上正轨。