当派生类重写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();
}
注意:我不是在寻找如何实施基本的处置模式,而是从人们的经验中得到更多的澄清。
答案 0 :(得分:4)
“这取决于”
你不能有一个严格的规则,因为你需要调用dispose的顺序将取决于类的实现。
有时你可能会在开始时,有时在结尾,有时在中间想要它。大多数时候,它可能无关紧要。
一般来说,人们似乎首先称呼它(在没有任何其他理由的情况下在不同的时间调用它)。
倾向于先调用它的一个原因是,如果需要,派生类有机会在事后做特殊的事情。
答案 1 :(得分:1)
您应该考虑不同方法的后果。在大多数情况下,基类拥有的IDisposable
对象将独立于派生类所拥有的对象,并且处理顺序无关紧要,前提是Dispose
个方法都不会抛出异常(*)。
如果释放IDisposable
资源至关重要,您可以考虑使用try / finally确保调用所有Dispose
方法 - 但这并非普遍适用。例如,System.Component.Container类管理和处理多个IDisposable
对象,但不会尝试确保在抛出异常时它们都被处置。
(*)Dispose
抛出是完全合法的:例如,FileStream
可能会尝试将数据刷新到Dispose
期间不再可用的网络资源。
答案 2 :(得分:0)
以相反的顺序处理对象以进行创建。所以首先是创建基类,所以它应该在最后处置,依此类推......