那你看看这个结果是什么using System; class B
{
public static int Y = A.X + 1;
static B() { Console.WriteLine("b"); }
}
class A
{
public static int X;
static A()
{
Console.WriteLine("A"+B.Y);
X = B.Y + 1;
}
}
class Program
{
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
} }结果是x=2,y=1
{
public static int Y = A.X + 1;
static B() { Console.WriteLine("b"); }
}
class A
{
public static int X;
static A()
{
Console.WriteLine("A"+B.Y);
X = B.Y + 1;
}
}
class Program
{
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
} }结果是x=2,y=1
加载顺序理应先加载B
但加载B前时,编译器察觉到B中使用了A的静态方法,因此编译器会在加载B前先去加载A
因此加载A时,B还未加载并初始化,所以A.X = B.Y + 1 = 0 + 1 = 1
A加载完后接着加载B,B.Y = A.X + 1 = 1 + 1 = 2
所以,A.X = 1 B.Y = 2
先初始化B 局部变量Y;并先计算 A.X+1 而A.X会调用其的构造函数 X=B.Y+1
并调用B.Y 而 B.Y 没有被赋值.所以Y取默认值0
返回到X=B.Y+1=〉A.X=1,Y=A.X+1=>B.Y=2
然后调用 B的构造函数
然后主函数 执行 Console.WriteLine("X={0},Y={1}", A.X, B.Y); 语句
调用 A.X,B.Y 时,先判断内存中是否有这个字段 有就使用
所以 x=1,y=2
就是 初始化Y是先Y=0;
而 后计算A.X+1 并赋给Y