我通过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
?这一切都是因为静态成员没有继承,所以它只是在第一行调用基类型?解释一下。感谢。
答案 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