class A
{
public static int X;
static A()
{
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B()
{ }
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
}
}
运行结果为X=1,Y=2
(引用到类的时候,静态的变量和方法会先被执行)
程序运行,寻找main函数的类,也就是class B,
因为静态的变量和方法会先被执行,故而会先声明静态变量Y,
变量Y中又使用到了class A的静态变量X,而且加载的过程中,类又会先将静态的变量和构造方法(构造方法,普通的静态方法并不会被执行)执行,
然后class B就声明了变量X,执行A方法,这也引用到了class A的X变量,这个时候,class B的Y变量已经在内存中声明了,但是A.X + 1还在运算中,所以这时,Y就等于它的默认值0,计算得到A.X=1,返回到Y=A.X + 1;得到B.Y=2,加载静态方法B,然后才到Main函数执行
现在我们来改变下class A
{
public static int X;
A()
{
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B()
{ }
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
}
}
当A的构造方法不是静态时,变量B.Y在调用A.X的时候,就不会去执行构造方法A,结果也就变成X=0,Y=1
(新手,写此只为将看过的东西做个笔记,有写错的地方请指出)