Framework Design Guidelines(第2版,第327页)中写道:
如果“close”是该领域的标准术语,可以考虑提供方法
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),然后在当前对象实例('this'或'Me'在Visual Basic中)上调用GC.SuppressFinalize,最后返回。
CA1063:Microsoft.Design:将'SomeClass.IDisposable.Dispose()'重命名为'Dispose',并确保它声明为public和sealed。
- 如何正确实现具有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' 并确保其声明为 public and sealed。
编辑2:确实缺少 CODE_ANALYSIS。谢谢。