CA1063修改Dispose(),使其调用Dispose(true),然后在当前对象实例上调用GC.SuppressFinalize,然后返回

时间:2018-09-25 18:01:34

标签: c# visual-studio dispose code-analysis

我上了这个课:

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修改Dispose()使其调用Dispose(true),然后调用   对当前对象实例进行GC.SuppressFinalize,然后返回。

还有一个:

  

CA1063确保将Dispose()声明为公共且已密封。

此行均是

public abstract void Dispose();

是否可以将Dispose()而不是ImplementsIDisposable中的InnerClass实施?

2 个答案:

答案 0 :(得分:1)

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

您需要检出处置模式并正确实施它。警告提示您应该怎么做,但是除非您知道模式的开始,否则它们可能是相当隐秘的。

您可以了解处置模式 here,这很简单。

当然,不要错过this canonical SO answer

答案 1 :(得分:1)

我试图遵循公认的答案,但是由于我方法的最后两行确实是Dispose(true)和GC.SupressFinalize(this),所以我一直碰壁。事实证明,警告并没有使我理解,这些应该是方法中的 ONLY 行,仅保留以下内容。我相信接受的答案中的第一个链接确实可以解释这种差异,但我并未像应该那样仔细地阅读它。

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/使我步入正轨。