namespace ConsoleApplication3
{
    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);
        }
    }
}
这段代码到底是怎么执行的,入口是Main函数吗?为什么加断点直接过去了,没有跳到class A中去???

解决方案 »

  1.   

    入口是Main函数。当然不会跳到class A中去了  public static的作用就是分配在静态空间上的。相当于C++中的全局变量。输出结果应该是X=0,Y=1static A()
            {
                X=B.Y+1;
            }
    不会被执行
      

  2.   

    执行的顺序是这样的,因为static是类似全局的变量,所以它是要先执行的,而这里B中有Main,所以先执行B,B中有Y,Y=A.x+1,进入A,X=B.Y+1,默认Y=0,所以X=1,返回,所以Y=2,进入Main,打印结果。
      

  3.   

    断点加在
     Console.WriteLine("X={0},Y={1}", A.X, B.Y);
    这一行啊
      

  4.   

    貌似有点道理,但为什么Y默认是0呢。
    我试过public static int X;
    Console.WriteLine(X);
    输出时0,但是
    public static int Y=A.X+1;
    Y是一个表达式啊
      

  5.   

       静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
    从这句话知道
    先执行      static B(){},然后执行
    static A()
            {
                X=B.Y+1;
            }
    因为Y=A.X+1; 因为static A()还在执行,x这时候是等于0的。所以,这时B.y=1;A.x=0;
    执行完A()之后A.x=1;
    再获取 B.Y: public static int Y=A.X+1; 
    所以这时候 Y=2
    输出的确是(1,2)
    http://www.35hunan.com/Portals/cgNs/News/20100122/News_5898.htm
    看这个楼主
      

  6.   

    因为执行的时候,首先从程序的入口点(就是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.   

    简单地说,触发断点要有操作,Main函数只调用了静态变量,当然进不了class A
    class A 构造函数也没调用