代码之家  ›  专栏  ›  技术社区  ›  dtb

如何正确使用close方法实现dispose模式(CA1063)

  •  12
  • dtb  · 技术社区  · 15 年前

    考虑提供方法 Close() ,除了 Dispose()

    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。用法:将“SomeClass.IDisposable.Dispose()”更改为调用“GC.SuppressFinalize(object)”。这将防止在对象被处置并超出范围后对其进行不必要的终结。

    CA1063:Microsoft.Design:修改“SomeClass.IDisposable.Dispose()”,使其调用Dispose(true),然后对当前对象实例调用GC.SuppressFinalize(“VisualBasic中的this”或“Me”),然后返回。

    CA1063:Microsoft.Design:将“SomeClass.IDisposable.Dispose()”重命名为“Dispose”,并确保它声明为公共并密封。

    -或-

    我试过了

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

    但FxCop 1.36仍然报告了这些问题。

    编辑 :按建议更改会消除除此警告以外的所有警告:

    编辑2 :代码分析确实缺失。谢谢

    2 回复  |  直到 4 年前
        1
  •  15
  •   Reed Copsey    15 年前

    改变一下。

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

    -------------------编辑后的进一步信息---------------

    此外,将声明更改为:

    public void Dispose()
    

    应该消除另一个错误。由于您已将其声明为:

    void IDisposable.Dispose()
    

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

        2
  •  1
  •   tanascius    15 年前

    SuppressMessage()仅在将代码\分析标志指定为条件编译符号时有效。