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

noc*_*ura 3 .net c# idisposable

参考:http://msdn.microsoft.com/en-us/library/b1yfkh5e(v = vs.110).aspx

在这个MSDN示例中,如果在子类中重写Dispose(bool),是否会执行此基类中的Dispose(bool)代码?IE会资源.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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

STW*_*STW 6

是的,它是覆盖Dispose()调用的类的标准base.Dispose().如果一个类被覆盖,Dispose那么它的基类只有在显式调用时才会执行它的实现.如果你的覆盖不遵从基类,那么你已经有效地承担了它的责任 - 这通常是不可取的.

还有必要以try/finally块的形式在您的实现中添加错误处理.使用finally块来调用基本Dispose方法; 这可以防止实现中的异常阻止其基类被处置.


CA2215:Dispose方法应该调用基类dispose(下面的文本是从这个源复制的)

原因

实现System.IDisposable的类型继承自也实现IDisposable的类型.继承类型的Dispose方法不调用父类型的Dispose方法.

规则说明

如果类型继承自一次性类型,则必须在其自己的Dispose方法中调用基类型的Dispose方法.调用基类型方法Dispose可确保释放由基类型创建的任何资源.

如何修复违规行为

要修复违反此规则的行为,请在Dispose方法中调用base.Dispose.

何时抑制警告

如果对base.Dispose的调用发生在比规则检查更深的调用级别,则可以安全地禁止来自此规则的警告.