我有下面的代码,我只有两个简单的问题,这些问题在下面的程序行为中是正常的,我不幸不会看到:
虽然:程序的输出是:
这是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()
//{
//}
}
答案 0 :(得分:5)
这是问题所在:
public static B b = new B();
静态字段初始值设定项在执行静态构造函数之前执行。从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
如果这没有帮助,请将Main
视为:
int tmp = B.BC.m; // This prints initialization bits
Console.WriteLine(tmp); // This prints 1
答案 1 :(得分:1)
这是因为这一行在static
构造函数之前运行:
public static B b = new B();
static
构造函数中的第一行(您看不到的部分,但实际上在那里)实际上正在调用B
的构造函数。这就是你没有看到static
构造函数首先命中的原因。
如果你这样写,你会看到static
构造函数首先命中:
static B()
{
Console.WriteLine("THis is staticcc");
b = new B();
}
public static B b;