gpt4 book ai didi

c# - 为什么不是在 C# 中调用所有静态构造函数(即父类的构造函数)?

转载 作者:太空狗 更新时间:2023-10-29 21:36:07 29 4
gpt4 key购买 nike

我有三个类,BaseDerivedFinalDerived 派生自 BaseFinal 派生自 Derived。所有三个类都有一个静态构造函数。将 Derived 分类为名为 Setup 的公共(public)静态方法。当我调用 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 的静态构造函数?

我可以通过调用 Base 的无操作静态方法或访问 Base 的一些虚拟静态方法来解决这个问题。但我想知道:这种看似奇怪的行为背后的原因是什么?

最佳答案

当(根据 TCPL ):

  • 创建类类型的实例。
  • 引用类类型的任何静态成员。

举个例子,考虑一个具有静态 Main 方法的类,其中执行开始:如果您有一个静态构造函数,它将在 Main 方法之前被调用打电话。

请注意,即使在执行静态构造函数之前,任何静态字段都会被初始化为它们的默认值,然后为这些字段执行静态字段初始化程序。只有这样,静态构造函数 (cctor) 才会被执行。


更直接地回答你的问题:静态构造函数不是继承的,它们不能被直接调用,因此你的 Base cctor 将不会在你的场景中被调用,除非你给出抽象 Base 类是一个静态方法并首先调用它,即在 Base.Initialize() 中,正如您已经建议的那样。

关于推理,这很简单,想想 C#(在 Java 中这是不同的):静态方法不被继承,因此静态构造函数也不应该被继承,因为这可能会导致不需要的副作用(当没有任何东西引用该类时调用 cctor) .

关于c# - 为什么不是在 C# 中调用所有静态构造函数(即父类的构造函数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6503588/

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