框架设计指南(第二版,第 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:微软用法:“SomeClass.Close()”调用“GC.SuppressFinalize(object)”,该方法通常仅在“IDisposable.Dispose”的实现中调用。有关详细信息,请参阅 IDisposable 模式。

CA1816:微软用法:更改“SomeClass.IDisposable.Dispose()”以调用“GC.SuppressFinalize(object)”。一旦对象被处置并且超出范围,这将防止对象不必要的终结。

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

CA1063:微软设计:将“SomeClass.IDisposable.Dispose()”重命名为“Dispose”,并确保将其声明为公共且密封。

  • 如何正确实现带有 close 方法的处置模式?

-或者-

  • 如何抑制警告?

我试过

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

但 FxCop 1.36 仍然报告它们。

编辑: :按照建议进行更改可以消除除此警告之外的所有警告:

CA1063:微软设计:将“SomeClass.IDisposable.Dispose()”重命名为“Dispose”,并确保将其声明为公共且密封。

编辑2: :CODE_ANALYSIS 确实丢失了。谢谢。

有帮助吗?

解决方案

改变它。

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

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

另外,将声明更改为:

public void Dispose()

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

void IDisposable.Dispose()

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

其他提示

如何抑制警告?

仅当您将 CODE_ANALYSIS 标志指定为条件编译符号时,SuppressMessage() 才起作用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top