框架设计指南(第2版,第327页)说:
除了Close()
之外,考虑提供方法
Dispose()
,如果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),然后在当前对象实例上调用GC.SuppressFinalize(在Visual Basic中为'this'或'Me') ,然后返回。
CA1063:Microsoft.Design:将'SomeClass.IDisposable.Dispose()'重命名为'Dispose',并确保将其声明为public并密封。
-OR -
我试过
[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并密封。
编辑2 :确实缺少CODE_ANALYSIS。感谢。
答案 0 :(得分:15)
改变它。
让Close()调用this.Dispose()并将逻辑放在Dispose()方法而不是Close()方法中。
-------------------编辑后的更多信息---------------
另外,将声明更改为:
public void Dispose()
应该摆脱其他错误。因为你把它声明为:
void IDisposable.Dispose()
它没有被标记为公开和密封,并且FxCop抱怨。就个人而言,我更愿意避免错误而不是压制错误。
答案 1 :(得分:1)
如何取消警告?
SuppressMessage()仅在将CODE_ANALYSIS标志指定为条件编译符号时才有效。