【发布时间】: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。谢谢。
【问题讨论】: