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();
        }
    }结果是 x=1,y=2  为什么?

解决方案 »

  1.   

    分别看看下面几种的结果: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();
            }
        }class A
        {
            public static int X;
            static A()
            {
                X = B.Y + 1;
            }
            static void Main()
            {
                Console.WriteLine("X={0},Y={1}", A.X, B.Y);
                Console.Read();
            }
        }
        class B
        {
            public static int Y = A.X + 1;
            static B() { }        
        }
    class A
        {
            public static int X;
            static A()
            {
                X = B.Y + 1;
            }
        }
        class B
        {
            public static int Y = A.X + 1;
            static B() { }        
        }
        static class Program
        {
            static void Main()
            {
                Console.WriteLine("X={0},Y={1}", A.X, B.Y);
                Console.Read();
            }
        }
    class A
        {
            public static int X;
            static A()
            {
                X = B.Y + 1;
            }
        }
        class B
        {
            public static int Y = A.X + 1;
            static B() { }        
        }
        static class Program
        {
            static void Main()
            {
                Console.WriteLine("Y={0},X={1}", B.Y, A.X);
                Console.Read();
            }
        }
      

  2.   

    int型的变量默认初始值是0,结合上面这句话你就该明白了
      

  3.   

    类被第一次使用时才会执行类静态成员初始化,而类静态成员初始化时,先执行静态初始化字段,再执行静态构造函数。Main函数因为是入口函数被宿主进程调用,由于Main是B的静态成员则按规则在调用前先初始化静态字段,也就是先执行Y = A.X + 1, 在计算表达式过程中需要用到A.X,执行点被转移到对A的静态成员初始化,A没有需要静态初始化的字段,就直接执行静态构造函数的X = B.Y + 1,B.Y还未完成初始化根据语言特性默认为0,此时X被初始化为1,然后Y就马上被初始化为2。
      

  4.   

    静态的构造函数会在类加载的时候执行
    ClassA: B.Y=0 所以 X=1
    ClassB: A.X=1 所以 Y=2