Lea*_*ner 0 .net c# static constructor
我有以下代码,我只有两个简单的问题,这些问题在下面的程序行为中是正常的,我不幸的是没有看到:
虽然:该程序的输出是:
这是Staticcc ......
1
...哪个是对的.
示例代码:
public sealed class B : A, C
{
public int? m = 0;
public B()
{
m = 1;
}
private B(int a, int b)
{
m = 2;
}
protected B(int x, int y, int z)
{
m = 3;
}
static B()
{
Console.WriteLine("THis is staticcc");
}
public static B b = new B();
public static B BC
{
get
{
return b;
}
}
static void Main()
{
Console.WriteLine(B.BC.m);
Console.ReadKey();
}
}
public interface C
{
}
public class A
{
//private A()
//{
//}
}
Run Code Online (Sandbox Code Playgroud)
这就是问题:
public static B b = new B();
Run Code Online (Sandbox Code Playgroud)
静态字段初始值设定项在执行静态构造函数之前执行.从C#规范部分10.5.5.1:
如果类中存在静态构造函数(10.12),则在执行该静态构造函数之前立即执行静态字段初始值设定项.
静态字段初始值设定项调用实例构造函数,因此实例构造函数是第一个执行的构造函数.
虽然:程序的输出是This is Staticcc ...然后1 ...哪个是正确的.
是的,因为所有初始化都是作为评估的一部分而发生B.BC.m的Main.
如果你添加Console.WriteLine("Instance Constructor");到你的构造函数中,你会看到:
Instance Constructor
THis is staticcc
1
Run Code Online (Sandbox Code Playgroud)
如果这没有帮助,请考虑Main这样:
int tmp = B.BC.m; // This prints initialization bits
Console.WriteLine(tmp); // This prints 1
Run Code Online (Sandbox Code Playgroud)