如果覆盖Dispose(bool),资源是否还会被处理?

时间:2014-07-09 20:47:53

标签: c# .net idisposable

参考: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();
        }
    }
}

1 个答案:

答案 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的调用发生在比规则检查更深的调用级别,则可以安全地禁止来自此规则的警告。