日期:2014-05-19  浏览次数:20817 次

一道面试题请教一下
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);
                      }
              }
产生的输出结果是什么?
顺便解释一下,谢谢!


------解决方案--------------------
x=1
y=2

原因:
程序从类B开始执行,所以要先用字段初始化器初始化静态字段Y,又因为Y=A.x+1; 既然要调用类A的静态字段,那么类A的静态构造函数就要执行,我们知道,类的静态构造函数是在类第一次被实例化或者类的静态字段第一次调用时候被执行。此时Y还没有被初始化,所以Y=0, X=0+1=1;
然后A的类初始化器执行后,开始执行 Y=A.X+1 也就是Y=1+1=2
------解决方案--------------------
X=1,Y=2

静态构造方法在代码引用类前执行

1. 执行静态构造方法 static A()
X = B.Y + 1 = 0 + 1 = 1;

2. 执行静态构造方法 static B()
Y = A.X + 1 = 1 + 1 = 2;
------解决方案--------------------
概念问题,论坛见过N次了
------解决方案--------------------
类的初始化顺序:
类B的字段初始化器 →类A的字段初始化器 → 类A的类初始化器 → 类B的类初始化器

把上面的例子搞的变态点:
 using System;


class A
{
public static int X=3;
static A(){
Console.WriteLine( "1 X={0},Y={1} ",A.X,B.Y);
X=B.Y+1;
Console.WriteLine( "2 X={0},Y={1} ",A.X,B.Y);
}
}
class B
{
public static int Y=A.X+1;
static B(){Y=5;Console.WriteLine( "4 X={0},Y={1} ",A.X,B.Y);}
static void Main(){
Console.WriteLine( "4 X={0},Y={1} ",A.X,B.Y);
Console.ReadLine();
}
}
结果如下:
1 x=3 y=0
2 x=1 y=0
3 x=1 y=5
4 x=1 y=5