c# - 如果 Dispose(bool) 被覆盖,资源是否仍然会被释放?

标签 c# .net idisposable

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

在这个 MSDN 示例中,如果在子类中重写 Dispose(bool),是否会执行该基类中的 Dispose(bool) 代码? IE。 resource.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();
        }
    }
}

最佳答案

是的,重写 Dispose() 的类调用 base.Dispose() 是标准的。如果一个类重写了 Dispose,那么它的基类只有在被显式调用时才会执行它的实现。如果您的覆盖不服从基类,那么您实际上已经承担了它的责任——这通常是不可取的。

在您的实现中以 try/finally block 的形式添加错误处理也是值得的。使用 finally block 调用基本的 Dispose 方法;这可以防止您的实现中的异常阻止其基类进行处理。


CA2215: Dispose methods should call base class dispose (以下文本是从该来源复制的)

原因

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

规则说明

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

如何解决违规问题

要解决违反此规则的问题,请在您的 Dispose 方法中调用 base.Dispose。

何时抑制警告

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

关于c# - 如果 Dispose(bool) 被覆盖,资源是否仍然会被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24663523/

相关文章:

c# - 关闭 using block 中的连接

c# - 安装了 EF 6 和 EF 6 工具的 VS 2012 中缺少 Entity Framework 上下文菜单

c# - 如何填补列表中属性值的空白?

c# - 如何在子类的某些属性上使用 JavaScriptSerializer

c# - Discord.net 向指定用户发送直接消息(PM)

c# - ID一次性 : Memory leaks

c# - 编码 mp3 或其他音乐文件

.net - 如何从asp.net上的url获取数据

c# - LINQ - 如何删除表中的重复行

c# - 非托管资源、IDisposable 和自定义类型