框架设计指南(第2版,第327页)说:
CONSIDER提供方法
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
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和sealed.
-要么-
我试过了
[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
Justification = "Framework Design Guidelines say it's ok.")]
void IDisposable.Dispose()
{
this.Close();
}
Run Code Online (Sandbox Code Playgroud)
但FxCop 1.36仍然报告他们.
编辑:根据建议更改它除了这个警告之外的所有内容:
CA1063:Microsoft.Design:将'SomeClass.IDisposable.Dispose()'重命名为'Dispose'并确保将其声明为public和sealed.
编辑2:CODE_ANALYSIS确实缺失了.谢谢.
Ree*_*sey 15
改变它.
让Close()调用this.Dispose()并将逻辑放在Dispose()方法而不是Close()方法中.
-------------------编辑后的更多信息---------------
此外,将声明更改为:
public void Dispose()
Run Code Online (Sandbox Code Playgroud)
应该摆脱其他错误.因为你把它声明为:
void IDisposable.Dispose()
Run Code Online (Sandbox Code Playgroud)
它没有被标记为公开和密封,并且FxCop抱怨.就个人而言,我更愿意避免错误而不是压制错误.