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

时间:2009-03-10 16:03:03

标签: c# fxcop

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

  除了Close()之外,

考虑提供方法Dispose(),如果close是该区域的标准术语。

     

执行此操作时,务必使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),然后在当前对象实例上调用GC.SuppressFinalize(在Visual Basic中为'this'或'Me') ,然后返回。

     

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

  • 如何正确地使用close方法实现dispose模式?

-OR -

  • 如何取消警告?

我试过

[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并密封。

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

2 个答案:

答案 0 :(得分:15)

改变它。

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

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

另外,将声明更改为:

public void Dispose()

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

void IDisposable.Dispose()

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

答案 1 :(得分:1)

  

如何取消警告?

SuppressMessage()仅在将CODE_ANALYSIS标志指定为条件编译符号时才有效。