【问题标题】:How to implement dispose pattern with close method correctly (CA1063)如何正确使用 close 方法实现 dispose 模式(CA1063)
【发布时间】:2010-10-12 11:17:58
【问题描述】:

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

考虑提供方法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),然后在当前对象实例(Visual Basic 中的“this”或“Me”)上调用 GC.SuppressFinalize ,然后返回。

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

  • 如何正确实现使用 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' 并确保将其声明为公共和密封。

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

【问题讨论】:

    标签: c# fxcop


    【解决方案1】:

    改变它。

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

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

    另外,将声明更改为:

    public void Dispose()
    

    应该摆脱其他错误。既然您已将其声明为:

    void IDisposable.Dispose()
    

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

    【讨论】:

      【解决方案2】:

      如何抑制警告?

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

      【讨论】:

        猜你喜欢
        • 2012-02-15
        • 1970-01-01
        • 2016-06-12
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        相关资源
        最近更新 更多