基类的处理顺序

本文关键字:顺序 处理 基类 | 更新日期: 2023-09-27 18:18:18

当派生类覆盖Dispose时,应该在派生类处置任何局部资源之前先调用基类Dispose吗?

我问的原因是因为我们团队中有人对每种情况都说"是",我正在努力弄清楚这是好主意还是只是"货物崇拜"程序,我对这两种情况都没有强烈的看法。

:

 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();
 }

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

基类的处理顺序

"取决于"

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

有时你可能想在开头,有时在结尾,有时在中间。大多数时候,这可能无关紧要。

一般来说,人们似乎先叫它(在没有其他理由的情况下,在其他时间叫它)。

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

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

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

(*) Dispose抛出是完全合法的:例如,FileStream可能会尝试将数据刷新到Dispose期间不再可用的网络资源。

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