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

3

我有这个类:

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和sealed。

两者都在这一行中:

public abstract void Dispose();

它是不是希望在ImplementsIDisposable内实现Dispose(),而不是在InnerClass中?
2个回答

3

没有理由让public Dispose()成为虚拟方法,更不应该是抽象的。

你需要查看“dispose模式”并正确实现它。警告提示了如何做到这一点,但如果您不知道该模式的运作方式,它们可能会相当晦涩。

您可以在此处阅读有关“Dispose模式”的内容,它非常简单。

当然,不要错过此主题的规范SO答案


1
我试图按照被接受的答案进行操作,但是我一直遇到了困难,因为我的方法的最后两行确实是Dispose(true)和GC.SuppressFinalize(this)。事实证明,警告没有让我理解这些应该是方法中唯一的行,留下类似以下内容的东西。我相信被接受的答案中的第一个链接实际上解释了这种差异,但我可能没有仔细阅读它。
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/帮助我找到正确的方向。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接