using System; 
class A //定义类A 
    { 
        public static int X; 
        static A() 
        { 
            X = B.Y + 1;         } 
    }//定义类B 
    class B 
    { 
        public static int Y = A.X + 1; 
        static B() { } 
        static void Main() 
        { 
            Console.WriteLine("X={0},Y={1}", A.X, B.Y);//2,1 
        } 
    } 
//为什么输出是x=1,y=2,请解释一下程序的运行过程! 

解决方案 »

  1.   

    X={0},Y={1}", 的意思也就是说后面的 A.x  和B.y的值  也就是说A.x=1=X,B.y=2=Y
      

  2.   

    静态成员最先被初始化
    所以public static int Y = A.X + 1;  的时候,A()把X变成了1(因为int类型的B.Y还没有完成初始化,所以还是默认的初始值0,于是有了A=0+1=1)然后返回给B,此时Y就成了1+1=2,
    所以,输出的时候成了1,2
      

  3.   

    X既是classA的静态属性,又是构造函数
      

  4.   

    首先要理解C#中静态构造函数的调用时机
        
      类型构造函数(也称为类构造函数或静态构造函数)用于初始化类型。CLR 在创建类型的第一个实例或调用类型上的任何静态成员之前调用类型构造函数。如果类型构造函数不是私有的,则它可由 CLR 以外的代码调用。根据在构造函数中执行的操作的不同,这可能导致意外行为。 其次要理解C#中静态变量的初始化时机
       C#在编译后,将静态变量的初始化总是在静态构造函数调用时进行,并保证在第一行代码前调用,因此以上代码可以改成
    using System;  
       class A //定义类A  
        {  
            public static int X;  
            static A()  
            {  
                X = B.Y + 1;          }  
        }    class B  
        {  
            public static int Y ;  
            static B() 
               { 
                   Y = A.X + 1;
               }  
            static void Main()  
            {  
                Console.WriteLine("X={0},Y={1}", A.X, B.Y);//2,1  
            }  
        } 
    因此也就很好理解了,首先是类申明时,静态变量均在类申明中此时
    X=0 Y=0
    然后当调用B的静态成员Main之前,CLR会调用static B
       此时 会调用Y = A.X +1 而此句话导到类A的静态构造函数调用
        如是有X=1 Y=2