gpt4 book ai didi

.net - 从 Dispose 或析构函数调用虚方法是否可以?

转载 作者:行者123 更新时间:2023-12-02 07:57:14 24 4
gpt4 key购买 nike

我找不到对它的引用,但我记得读过在析构函数或 IDisposable 的 Dispose() 方法中调用虚拟(多态)方法不是一个好主意。

这是真的吗?如果是,有人可以解释原因吗?

最佳答案

出于同样的原因,从终结器/Dispose 调用虚拟方法是不安全的 it is unsafe to do in a constructor .无法确定派生类尚未清除虚拟方法正确执行所需的某些状态。

有些人对标准的 Disposable 模式及其对虚拟方法 virtual Dispose(bool disposing) 的使用感到困惑,并认为这使得使用 any 处理过程中的虚拟方法。考虑以下代码:

class C : IDisposable {
private IDisposable.Dispose() {
this.Dispose(true);
}
protected virtual Dispose(bool disposing) {
this.DoSomething();
}

protected virtual void DoSomething() { }
}
class D : C {
IDisposable X;

protected override Dispose(bool disposing) {
X.Dispose();
base.Dispose(disposing);
}

protected override void DoSomething() {
X.Whatever();
}
}

以下是当您 Dispose 和类型为 D 的对象(称为 d)时发生的情况:

  1. 一些代码调用((IDisposable)d).Dispose()
  2. C.IDisposable.Dispose() 调用虚方法D.Dispose(bool)
  3. D.Dispose(bool) 处理 D.X
  4. D.Dispose(bool) 调用 C.Dispose(bool) 静态(调用的目标是已知的编译时)
  5. C.Dispose(bool) 调用虚拟方法 D.DoSomething()
  6. D.DoSomething 在已处置的 D.X
  7. 上调用方法 D.X.Whatever()
  8. ?

现在,大多数运行这段代码的人都会做一件事来修复它——他们在清理自己的对象之前移动 base.Dispose(dispose) 调用。而且,是的,这确实有效。但是你真的相信程序员 X,来自你为其开发 C 的公司的 Ultra-Junior Developer,被分配编写 D,以错误的方式编写它是检测到,还是在正确的位置调用了 base.Dispose(disposing)

我并不是说您永远不应该永远编写从 Dispose 调用虚方法的代码,只是您需要记录该虚方法的要求它从不使用在 C 下派生的任何类中定义的任何状态。

关于.net - 从 Dispose 或析构函数调用虚方法是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/137621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com