静态构造函数和继承

时间:2014-05-08 16:22:42

标签: c# .net inheritance constructor static

我通过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.WriteLine(ClassB.val1);
Console.WriteLine(ClassB.val2);
Console.WriteLine(ClassB.val1);

输出是:

10
0
15

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

2 个答案:

答案 0 :(得分:7)

因为第一个呼叫将在内部转换为Console.WriteLine(ClassA.val1);,这首先是呼叫的样子。能够调用ClassB.val1只是方便编译器方面。 val1字段仅与ClassA相关,且与运营商方ClassB无关。

答案 1 :(得分:3)

添加到@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