class A
{
public static int X = 3;
static A()
{
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B()
{
Y = 1;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("{0}.....{1}",A.X,B.Y);
Console.ReadLine();
}
}大家测试下,输出的情况,我看了结果,有点迷糊,请大家谈论下吧
当构造A的时候 X=B.Y+1 => X=2
所以输出2.....1 ^^
先执行A.X(下面是执行A.X的过程):
所以先构造A,而A构造函数中X=B.Y+1;
这里有B.Y,所以又得构造类B?类B构造函数中Y=1,而这里B.Y是访问的
B类中的字段Y,而又有 Y = A.X + 1;这里又有了A.X,又回到了A的构造中?不知道我这样理解对不对
第一次访问类的静态成员时,完成静态成员的初始化,包括静态构造函数的运行。
在运行到A.X时,对X进行初始化,运行A的静态构造函数,而在这个构造函数中访问了B.Y,于是运行B的静态构造函数,将Y赋值为1,最终返回A的静态构造函数将X赋值为2
或许我理解错了,在实例化类B的时候,实际上已经吧B中字段Y的值用1给覆盖了,也就是说
实例化B后,B.Y就是1了,而public static int Y = A.X + 1;
已经不起作用了
你也可以去看下
http://www.cnblogs.com/enric1985/articles/1223277.html
B.Y=1对吗?我觉得顺序是先初始化语句,然后私有静态构造器所以构造器中的值是最后的值;
(1)执行A.X时,顺序执行类A中的成员;
(2)执行到X=B.Y+1时,由于调用类B中的Y,因此转而顺序执行类B;
(3)执行类B后,B.Y=1,然后再转向类A中的X=B.Y+1 ->X=2
wind1373290 :thanks,看了那篇文章,明白多了
----------------------------------
执行A.X:
首先执行静态成员初始化,为3,然后实行构造器,在构造器中,
X=B.Y+1;于是访问B类,同样先执行B的静态成员Y:Y=A.X+1;(这里A.X=3,),然后
Y=4,然后执行B的构造器,在构造器中Y更新为1,所以最终,B.Y=1,所以A.X=2;
执行B.Y:
由于构造器后执行,并且在构造器中,Y=1,所以静态成员初始化对Y的值并没有起作用
----------------------------------
补充下:如果这两个类的构造器不是static的?
结果为3....4,这种情况下,执行A.X,B.Y的时候就不执行构造器了吧,只是
初始化静态成员而已
执行类B的构造函数后,Y的值为1. 跟Y的初始值没有关系。
即使改成下面这样,也是输出同样的结果。
class A
{
public static int X ;
static A()
{
X = B.Y + 1;
}
}
class B
{
public static int Y;
static B()
{
Y = 1;
}
}
(1)执行A.X时,顺序执行类A中的成员;
(2)执行到X=B.Y+1时,由于调用类B中的Y,因此转而顺序执行类B;
(3)执行类B后,B.Y=1,然后再转向类A中的X=B.Y+1 ->X=2