基类处理顺序

时间:2013-06-13 12:55:40

标签: c# .net dispose

当派生类重写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();
 }

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

3 个答案:

答案 0 :(得分:4)

“这取决于”

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

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

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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