框架设计指南(第 2 版,第 327 页)说:
考虑提供方法
Close()
,除了Dispose()
, if 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),然后在当前对象实例(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。谢谢。