参考:http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx
在这个MSDN示例中,如果在子类中重写Dispose(bool),是否会执行此基类中的Dispose(bool)代码? I.E.资源.Dispose()会被调用吗?子类是否需要调用base.Dispose(true)?
public class DisposableResourceHolder : IDisposable {
private SafeHandle resource; // handle to a resource
public DisposableResourceHolder(){
this.resource = ... // allocates the resource
}
public void Dispose(){
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing){
if (disposing){
if (resource!= null) resource.Dispose();
}
}
}
答案 0 :(得分:6)
是的,它是覆盖Dispose()
来调用base.Dispose()
的类的标准。如果一个类重写了Dispose
,那么它的基类只有在显式调用时才会执行它的实现。如果你的覆盖不顺从基类,那么你已经有效地承担了它的责任 - 这通常是不可取的。
还值得以try/finally
块的形式在您的实现中添加错误处理。使用finally
块调用基本Dispose
方法;这可以防止实现中的异常阻止其基类的处理。
CA2215: Dispose methods should call base class dispose(以下文字与此来源重复)
<强>原因强>
实现System.IDisposable的类型继承自也实现IDisposable的类型。继承类型的Dispose方法不会调用父类型的Dispose方法。
规则说明
如果类型继承自一次性类型,则必须在其自己的Dispose方法中调用基类型的Dispose方法。调用基类型方法Dispose可确保释放由基类型创建的任何资源。
如何修复违规行为
要修复违反此规则的行为,请在Dispose方法中调用base.Dispose。
何时停止警告
如果对base.Dispose的调用发生在比规则检查更深的调用级别,则可以安全地禁止来自此规则的警告。