基类的处理顺序
本文关键字:顺序 处理 基类 | 更新日期: 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
期间不再可用的网络资源。
按创建的相反顺序处置对象。所以首先是创建基类,所以它应该在最后处置,等等…