静态构造函数和继承
本文关键字:继承 构造函数 静态 | 更新日期: 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