using System;
    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);
            Console.Read();
        }
    }请详细说明静态构造函数的执行顺序,然后具体说明输出时候的顺序,然后说明为什么输出第一个的时候调用B.Y当时Y并没有值,它是怎么运行的!谢谢!一定要详细!!

解决方案 »

  1.   

    首先显然是main 函数
     然后执行A的构造函数
     在执行A的构造函数的时候
     由于X = B.Y + 1; 这个地方有B的实例
     B的构造函数会被调用
     int 型 不赋值
     也默认的有初始的值0
     也就是说  执行B的构造函数的时候A.x的值是0
    所以B.Y=1
     然后A。X的值就是2了
      

  2.   

    高手们额,我知道是先调用的B.Y,结果X=1,Y=2,输出顺序是从左到有,先输出X=1,后输出Y=2,我的问题的关键是为什么当调用B.Y的时候,B.Y会是0   ??????
      

  3.   

    初始int 型
     不赋值 就是0
      

  4.   

    输出:
    X=1,Y=2顺序
    X = B.Y + 1;       //此时B.Y = 0int Y = A.X + 1;   //A.X = 1
      

  5.   

    sorry,貌似说错了...少打了个断点...
      

  6.   

    又是我自己在网上把答案搜到的,无语了……大家都看看吧……这个题目的答案是 1,2
    为什么呢?
    因为执行的时候,首先从程序的入口点(就是Main())找起,因为Main在类B中,所以从B类开始加载。执行顺序大致是这样的:
    (用到一个类的时候是先对其静态变量初始化,然后调用他的静态构造函数)
    (类的静态构造函数只在加载类的时候由系统调用一次且只此一次)
    1.初始化B类的静态变量 Y,系统先给他一个默认值(此处是0),然后再执行他的初始化赋值语句public static int Y = A.X + 1;
    2.执行这条语句的时候因为用到了A.X,所以遇到A的时候去加载类A,顺序一样,先是执行A的静态变量X的初始化工作public static int X;因为没有对其赋值的操作,所以X就是系统给他的默认值0;然后调用A的静态构造函数(B那里也是先初始化静态变量,然后才调用静态构造函数,因为B初始化静态变量的时候用到了A所以才会跳到A来,不然的话B那边也是初始化静态变量之后系统紧接着就会调用B的静态构造函数);
    3,A的静态构造函数中执行X = B.Y + 1;可以知道,此时B.Y已经有了一个系统给他的默认值0,所以此处就是X=0+1;现在X就是1了
    4,X那边都完工了,回到刚才跳转X的地方继续执行,就是继续执行Y = A.X + 1;毫无疑问此时是Y=1+1;至此,B的静态变量初始化完成了。
    5,B的静态变量初始化完成了那紧接着就是系统调用B的静态构造函数,此处什么也不执行。
    6.输出结果1,2
      

  7.   

    http://blog.sina.com.cn/s/blog_55100f7901000c6i.html
      

  8.   

    order:
    int Y = A.X + 1;     //此处用到A,所以去掉用A的static构造函数static A()
    {
        X = B.Y + 1;     //B.Y = 0,类filed member 没赋值的话,默认值 0
    }Y = A.X + 1;         //A.X = 1static B() { }