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();
        }
    }大家测试下,输出的情况,我看了结果,有点迷糊,请大家谈论下吧

解决方案 »

  1.   

    B.Y为1  这个不难理解
    当构造A的时候 X=B.Y+1  =>  X=2
    所以输出2.....1 ^^
      

  2.   

    wind1373290 :
    先执行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的构造中?不知道我这样理解对不对
      

  3.   

    输出2.....1
    第一次访问类的静态成员时,完成静态成员的初始化,包括静态构造函数的运行。
    在运行到A.X时,对X进行初始化,运行A的静态构造函数,而在这个构造函数中访问了B.Y,于是运行B的静态构造函数,将Y赋值为1,最终返回A的静态构造函数将X赋值为2
      

  4.   

    wind1373290 : 
    或许我理解错了,在实例化类B的时候,实际上已经吧B中字段Y的值用1给覆盖了,也就是说
    实例化B后,B.Y就是1了,而public static int Y = A.X + 1;
    已经不起作用了 
      

  5.   

    呵呵  我刚看了篇文章 里面可能有你要的答案 
    你也可以去看下
    http://www.cnblogs.com/enric1985/articles/1223277.html
      

  6.   

    A.X=2
    B.Y=1对吗?我觉得顺序是先初始化语句,然后私有静态构造器所以构造器中的值是最后的值;
      

  7.   

    类A,B没有被实例化,而是调用自身.
    (1)执行A.X时,顺序执行类A中的成员;
    (2)执行到X=B.Y+1时,由于调用类B中的Y,因此转而顺序执行类B;
    (3)执行类B后,B.Y=1,然后再转向类A中的X=B.Y+1 ->X=2
      

  8.   

    ProjectDD :你说的对
    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的时候就不执行构造器了吧,只是
    初始化静态成员而已
      

  9.   

    执行类A的构造函数后,X的值为2. 跟X的初始值没有关系。
    执行类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;
    }
    }
      

  10.   

    我调试了一下也是2.....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