【问题标题】:IDisposable with Multiple Levels of Inheritance [duplicate]具有多个继承级别的 IDisposable [重复]
【发布时间】:2013-08-14 14:16:35
【问题描述】:

假设你有以下继承链:

class A : IDisposable
{
    public void Dispose()...
    protected virtual void Dispose(bool disposing)...
}

class B : A
{
    // Virtual or Override for B?
}

class C : B
{
    protected override void Dispose(bool disposing)...
}

如果A、B、C各有自己的私有IDisposable资源,B应该如何声明Dispose(bool)

【问题讨论】:

  • 是否可以在一个类中声明两个没有参数的 void Dispose?
  • 您只需致电base.Dispose() 并免费拥有B 资源。有什么问题?
  • 该模式实际上需要protected virtual void Dispose(bool disposing),所以你的问题在你开始之前就已经很无聊了。

标签: c# .net oop idisposable


【解决方案1】:

您应该覆盖,而不是隐藏

class A : IDisposable
{
    public void Dispose() {
      Dispose(true);
      GC.SuppressFinalize(this); // <- May be excluded
    }

    protected virtual void Dispose(Boolean disposing)... // <- "disposing" recommended by Microsoft
}

class B : A
{
    protected override void Dispose(Boolean disposing) {
      // Dispose here all private resources of B
      ...
      base.Dispose(disposing);
    }
}

class C : B
{
    protected override void Dispose(Boolean disposing) {
      // Dispose here all private resources of C
      ...
      base.Dispose(disposing);
    }
}

【讨论】:

  • 将此标记为答案,因为您解决了覆盖部分,以及应该调用 base.Dispose() 的事实。我现在问这个问题感觉像个傻瓜,我知道!
  • 您是否建议在每个类中添加一个析构函数(并调用 this.Dispose(false);)?如果 A 类和 B 类是抽象类,你的解决方案会有什么不同吗?
  • @progLearner: c# 没有destructor,但是有finalizer;当你实现终结器时,请注意终结器的执行顺序是没有指定,所以你不应该使用reference类型的字段。因此,~C() 的唯一相关情况可能是当您将资源作为低级结构获取时(指针 IntPtr)。 AB 或两者都是 abstract 类无关紧要
  • 谢谢。我在询问终结者,因为我想确保我的客户端应用程序在关闭时调用 Dispose()。这不是终结器的用途吗?
  • @progLearner:当应用程序(即进程)关闭时,操作系统将释放所有获取的资源——打开的文件、流等;如果您想确保某些特殊资源(如 rdbms 连接)被正确释放(例如,提交和关闭),您可以尝试使用Application.ApplicationExit 事件等。请注意,finalizer 完全可以执行
【解决方案2】:

它应该使用override 声明它。如果它声明使用virtual 而不是override,那么这将隐藏 A.Dispose

顺便说一句,你不能在A 中声明两个Dispose 方法,两者都没有参数(它们不能通过返回类型或访问器来区分)。

【讨论】:

  • 谢谢,这是我的错字
猜你喜欢
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
相关资源
最近更新 更多