如何正确实现配置模式(CA1063)

dtb*_*dtb 12 c# fxcop

框架设计指南(第2版,第327页)说:

CONSIDER提供方法Close(),除了Dispose(),如果close是该区域的标准术语.

这样做时,重要的是使Close实现相同DisposeIDisposable.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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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),然后在当前对象实例上调用GC.SuppressFinalize(在Visual Basic中为'this'或'Me'),然后回报.

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();
}
Run Code Online (Sandbox Code Playgroud)

但FxCop 1.36仍然报告他们.

编辑:根据建议更改它除了这个警告之外的所有内容:

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

编辑2:CODE_ANALYSIS确实缺失了.谢谢.

Ree*_*sey 15

改变它.

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

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

此外,将声明更改为:

public void Dispose()
Run Code Online (Sandbox Code Playgroud)

应该摆脱其他错误.因为你把它声明为:

void IDisposable.Dispose()
Run Code Online (Sandbox Code Playgroud)

它没有被标记为公开和密封,并且FxCop抱怨.就个人而言,我更愿意避免错误而不是压制错误.