如何正确实现Dispose模式和Close方法(CA1063)

12

Framework Design Guidelines(第2版,第327页)中写道:

如果“close”是该领域的标准术语,可以考虑提供方法Close()以补充Dispose()

在这样做时,重要的是确保Close的实现与Dispose相同,并考虑显式实现IDisposable.Dispose方法。

所以,根据提供的示例,我有了这个类:

public class SomeClass : IDisposable {
    private SomeDisposable someInnerDisposable;

    public void Open() {
        this.someInnerDisposable = new SomeDisposable();
    }

    void IDisposable.Dispose() {
        this.Close();
    }

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

    protected virtual void Dispose(bool disposing) {
        if (disposing) {
            this.someInnerDisposable.Dispose();
            this.someInnerDisposable = null;
        }
    }
}

FxCop不太喜欢这个:

CA1816:Microsoft.Usage:'SomeClass.Close()'调用了'GC.SuppressFinalize(object)',这是通常只在实现'IDisposable.Dispose'中调用的方法。有关详细信息,请参阅IDisposable模式。

CA1816:Microsoft.Usage:将'SomeClass.IDisposable.Dispose()'更改为调用'GC.SuppressFinalize(object)'。这将防止对象在销毁后仍处于作用域内时进行不必要的终结。

CA1063:Microsoft.Design:修改'SomeClass.IDisposable.Dispose()'以便它调用Dispose(true),然后在当前对象实例('this'或'Me'在Visual Basic中)上调用GC.SuppressFinalize,最后返回。

CA1063:Microsoft.Design:将'SomeClass.IDisposable.Dispose()'重命名为'Dispose',并确保它声明为public和sealed。

  • 如何正确实现具有close方法的dispose模式?

-或者-

  • 如何禁止这些警告?

我尝试过:

[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
    Justification = "Framework Design Guidelines say it's ok.")]
void IDisposable.Dispose()
{
    this.Close();
}

但是 FxCop 1.36 仍然报告它们。

编辑:根据建议进行更改后,除了这个警告之外,所有警告都消失了:

CA1063 : Microsoft.Design : 将 'SomeClass.IDisposable.Dispose()' 重命名为 'Dispose' 并确保其声明为 public and sealed。

编辑2:确实缺少 CODE_ANALYSIS。谢谢。

2个回答

15

将其改变。

让Close()方法调用this.Dispose(),并把逻辑放在Dispose()方法中而不是在Close()方法中。

------------------- 编辑后更多信息 ---------------

此外,将声明更改为:

public void Dispose()

应该摆脱另一个错误。因为您已将其声明为:

void IDisposable.Dispose()

它没有被标记为公共的和密封的,而且FxCop会抱怨。个人而言,我更喜欢避免错误而不是压制它们。


1
我该如何抑制警告?
只有在指定CODE_ANALYSIS标志作为条件编译符号时,SuppressMessage()才起作用。

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