【问题标题】:In C#, is it safe to call virtual method from constructor? [duplicate]在 C# 中,从构造函数调用虚方法是否安全? [复制]
【发布时间】:2011-09-21 17:49:30
【问题描述】:

可能重复:
Virtual member call in a constructor

在 C# 中,从构造函数调用虚方法是否安全?语言规范是怎么说的?请同时引用规范。 安全,我的意思是它会调用派生类的实现吗?

这个疑惑存在于我的脑海中,因为在C++中,从构造函数调用虚函数是安全的。

【问题讨论】:

  • 好的!存在重复项。投票赞成关闭!
  • 为什么将“安全”定义为调用派生类的实现?可以合理地论证 C++ 的技术(根据类的哪些部分已初始化来调用方法实现)是更安全的选择。

标签: c# constructor polymorphism virtual


【解决方案1】:

你可以这样做,但你不应该这样做。我认为 C# 甚至会给你一个警告。

当函数被派生类覆盖时会变得非常危险,因为您现在在调用派生类的构造函数之前调用该函数。

【讨论】:

  • 在 C++ 中,不调用派生类实现,正是出于这个原因。
  • 在 C++ 中的内存可能没有完全初始化,但在 C# 中这不是问题。
  • @Gabe:初始化的内存与正在建立的不变量不同。
  • @Ben:确实如此。但是,由于保证内存被初始化,您可以可靠地检测到您的不变量可能无法保持和正确运行。我并不是说这是个好主意,但你可以编写可靠的代码来做到这一点。
  • @Gabe:无论如何,在 C++ 中,派生类内存没有完全初始化,这就是函数的派生版本没有被调用的原因。被调用的版本匹配内存已完全初始化的基础子对象(所有活动动态类型的子对象都已构建)。
【解决方案2】:

这是不安全的,因为在匹配的构造函数有机会建立类不变量之前会调用虚函数。

相比之下,它在 C++ 中是安全的——被调用的函数是在匹配的构造函数期间调用的,而不是之前。

【讨论】:

  • 我编辑了我的问题,说出我所说的“安全”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
相关资源
最近更新 更多