【发布时间】:2013-01-17 01:14:52
【问题描述】:
如果 C# 派生的 IDisposable 类构造函数产生错误,如何处置已经完全构造的 IDisposable 基类?
由于类层次结构中的所有字段在任何构造函数执行之前都已初始化,派生构造函数调用 base.Dispose() 是否安全?它违反了在对象完全构造之前不调用虚方法的规则,但我想不出另一种方法来做到这一点,而且我的搜索没有发现任何关于这种情况的信息。
【问题讨论】:
-
如果可以帮助构造函数不应该抛出异常。改为使用 init 方法。
-
构造函数不应调用不需要能够处理部分构造的对象的虚拟方法。为可继承类正确编写的 dispose 方法通常必须能够处理部分构造的对象,因为这是防止泄漏的最实用方法。
-
@supercat:在所有构造函数运行之前,我没有意识到虚函数表已经到位。假设 Dispose 方法被编写为处理部分构造的对象(我的是),您希望将派生类标记为已密封,以便某人不会从该类继承并在他们的类中定义一个未处理部分的虚拟 dispose 方法构造对象。
-
@jimvfr:除非派生类有理由对子类比它的基类更偏执,否则为什么要假设即使它可以遵循基类契约,子派生类也不会能够?我认为应该主要根据其他基础做出是否密封类的决定。
标签: c# constructor dispose