4

当派生类重写 Dispose 时,是否应该在派生类释放任何本地资源之前先调用基类 Dipose?

我问的原因是因为我们团队中的某个人对每种情况都说“是”,我正在尝试确定这是一个好主意还是只是“货物崇拜”编程,无论哪种方式我都没有强烈的看法。

前:

 public override void Dispose()
 {
     base.Dispose();

     if (!_isDisposed)
     {
         _isDisposed = true;

         if (_foo != null)
         {
             _foo.Dispose();
         }
     }
 }

后:

 public override void Dispose()
 {
     if (!_isDisposed)
     {
         _isDisposed = true;

         if (_foo != null)
         {
             _foo.Dispose();
         }
     }

     base.Dispose();
 }

注意:我不是在寻找如何实现基本的处置模式,而是从人们的经验中得到更多的澄清。

4

3 回答 3

5

“这取决于”

您不能对此有一个硬性规定,因为您需要调用 dispose 的顺序将取决于类的实现。

有时您可能希望在开始时、有时在结束时、有时在中间时使用它。大多数时候,这可能无关紧要。

一般来说,人们似乎首先调用它(在没有任何其他理由在不同时间调用它的情况下)。

倾向于首先调用它的一个原因是,如果需要,派生类之后有机会做一些特殊的事情。

于 2013-06-13T13:01:23.293 回答
1

您应该考虑不同方法的后果。在大多数情况下,IDisposable基类拥有的对象将独立于派生类拥有的对象,并且处置顺序无关紧要,前提是没有任何Dispose方法抛出异常(*)。

如果释放IDisposable资源很关键,您可以考虑使用 try/finally 来确保Dispose调用所有方法 - 但这并不是普遍适用的。例如,System.Component.Container类管理和释放多个IDisposable对象,但不会尝试确保在抛出异常时将它们全部释放。

(*) 抛出是完全合法的Dispose:例如,aFileStream可能会尝试将数据刷新到在Dispose.

于 2013-06-13T13:19:30.183 回答
0

以相反的顺序处理对象以创建。所以首先是创建基类,所以它应该在最后处置,等等......

于 2013-06-13T13:35:13.330 回答