静态构造函数和继承

本文关键字:继承 构造函数 静态 | 更新日期: 2023-09-27 18:02:37

我通过c#阅读了Jeffrey Richter - CLR,并决定制作一些测试应用程序。我需要一些帮助来理解到底发生了什么以及为什么。是的,我知道,公共财产是坏主意,但我的问题不是关于代码风格。所以:

class ClassA
{
    public static int val1;
    static ClassA
    {
        val1 = 10;
    }
}
class ClassB : ClassA
{
    public static int val2;
    static ClassB
    {
        val1 = 15;
    }
}

现在我们按以下顺序调用console输出:

Console.WriteLine(ClassB.val1);
Console.WriteLine(ClassB.val2);
Console.WriteLine(ClassB.val1);

输出是:

10
0
15

所以,据我所知,当第一次使用该类型的静态成员时,编译器将调用static ctor。在使用之前。那么为什么static ctor (ClassB)不在第一行呢?这都是因为静态成员没有继承,所以它只在第一行调用基类型?请解释。谢谢。

静态构造函数和继承

因为第一个调用将在内部转换为Console.WriteLine(ClassA.val1);,这就是调用应该首先看起来的样子。能够调用ClassB.val1只是从编译器的角度方便。val1字段只与ClassA相关,与运行时侧的ClassB无关。

添加到@Euphoric的答案。这是IL生成(由LinqPAD显示)

IL_0001:  ldsfld      UserQuery+ClassA.val1
IL_0006:  call        System.Console.WriteLine
IL_000B:  nop         
IL_000C:  ldsfld      UserQuery+ClassB.val2
IL_0011:  call        System.Console.WriteLine
IL_0016:  nop         
IL_0017:  ldsfld      UserQuery+ClassA.val1
IL_001C:  call        System.Console.WriteLine
ClassA..ctor:
IL_0000:  ldarg.0     
IL_0001:  call        System.Object..ctor
IL_0006:  ret         
ClassB..ctor:
IL_0000:  ldarg.0     
IL_0001:  call        UserQuery+ClassA..ctor
IL_0006:  ret         
http://share.linqpad.net/a5gjhv.linq