继承的静态成员的静态初始化

2024-05-13

考虑这个示例代码:

public class A<T> 
{
    public static T TheT { get; set; }
}
public class B : A<string>
{
    static B() {
        TheT = "Test";
    }
}

public class Program {
    public static void Main(String[] args) {
        Console.WriteLine(B.TheT);
    }
}

Here B.TheT一片空白。然而,改变Main像这样的方法:

public static void Main() {
    new B();
    Console.WriteLine(B.TheT);
}

B.TheT正如预期的那样,是“测试”。我可以理解这会强制静态构造函数运行,但为什么第一种情况不会发生这种情况?

我尝试阅读规范,这引起了我的注意(§10.12):

[...] 静态构造函数的执行由第一个构造函数触发 应用程序域内发生以下事件:

• [...]

• 引用类类型的任何静态成员。

我对此的解释是,自从TheT不是以下成员B,静态构造函数B不强制运行。它是否正确?

如果这是正确的,我最好怎么让B指定如何初始化TheT?


正如预期的那样,A.TheT 是“测试”。我可以理解这会强制静态构造函数运行,但为什么第一种情况不会发生这种情况?

基本上,你还没有really引用的B。如果你查看 IL,我想你会发现你的代码实际上相当于:

public static void Main(String[] args) {
    Console.WriteLine(A<string>.TheT);
}

编译器计算出这是really你指的成员,即使你写了B.TheT.

如果这是正确的,我最好如何让 A 指定如何初始化 TheT?

老实说,我会尽量避免从一开始就这样做......但你总是可以添加一个静态方法B:

public static void Initialize() {
    // Type initializer will be executed now.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

继承的静态成员的静态初始化 的相关文章

随机推荐