我有三节课,Base
, Derived
and Final
. Derived
源自于Base
and Final
源自于Derived
。所有三个类都有一个静态构造函数。班级Derived
作为一个名为的公共静态方法Setup
。当我打电话时Final.Setup
,我希望所有三个静态构造函数都会被执行,但只有其中的一个Derived
运行。
这是示例源代码:
abstract class Base
{
static Base()
{
System.Console.WriteLine ("Base");
}
}
abstract class Derived : Base
{
static Derived()
{
System.Console.WriteLine ("Derived");
}
public static void Setup()
{
System.Console.WriteLine ("Setup");
}
}
sealed class Final : Derived
{
static Final()
{
System.Console.WriteLine ("Final");
}
}
这对我来说只有部分意义。我明白那个呼唤Final.Setup()
实际上只是一个别名Derived.Setup()
,所以跳过静态构造函数Final
看起来很公平。但是,为什么不是静态构造函数Base
called?
我可以通过调用一个无操作静态方法来解决这个问题Base
或者通过访问一些虚拟静态方法Base
。但我想知道:这种明显奇怪的行为背后的原因是什么?
当(根据TCPL):
- 创建类类型的实例。
- 类类型的任何静态成员都会被引用。
举个例子,考虑一个带有 static 的类Main
开始执行的方法:如果你有一个静态构造函数,它将被调用before调用 Main 方法。
请注意,即使在执行静态构造函数之前,所有静态字段也会被初始化为其默认值,然后为这些字段执行静态字段初始值设定项。只有这样,静态构造函数(cctor)才会被执行。
更直接地回答你的问题:静态构造函数不是继承的,并且不能直接调用它们,因此你的Base
cctor 在您的场景中不会被调用,除非您给出摘要Base
类静态方法并首先调用它,即如Base.Initialize()
,正如您已经建议的那样。
关于推理,这很简单,思考 C#(在 Java 中这是不同的):静态方法不被继承,因此静态构造函数也不应该被继承,因为这可能会导致不需要的副作用(当没有任何内容引用该类时调用的 cctor)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)