今天看到了一道c#笔试题,是关于静态字段和静态构造函数初始化的。静态函数是c#新的特性,如果不知道它的初始化顺序就会对这道题晕头转向。对于静态构造函数可以参考http://www.cnblogs.com/michaelxu/archive/2007/03/29/693401.html。下来从这道笔试题来分析一下静态构造函数的初始化顺序。
Code
1 class A
2 {
3 public static int X;
4 static A()
5 {
6 X = B.Y + 1;
7 }
8 }
9 class B
10 {
11 public static int Y = A.X + 1;
12 static B() { }
13 static void Main()
14 {
15 Console.WriteLine("X={0},Y={1}", A.X, B.Y);
16 }
17 }
18
1 class A
2 {
3 public static int X;
4 static A()
5 {
6 X = B.Y + 1;
7 }
8 }
9 class B
10 {
11 public static int Y = A.X + 1;
12 static B() { }
13 static void Main()
14 {
15 Console.WriteLine("X={0},Y={1}", A.X, B.Y);
16 }
17 }
18
产生的输出结果是什么?
1先调用Main函数,它是B的静态方法,当第一次调用一个类中任何静态成员时就会调用静态构造函数,在此之前要为B中静态字段Y分配内存,执行代码第11行
2执行第一步时调用了A的静态成员X,就触发了A的静态构造函数的调用,执行代码第6行,这行又出现B静态字段Y,由于Y还没有初始化,默认为0,因此这一行X=1
3运行完A静态构造函数后回到第11行,Y=2
4运行完B的静态构造函数后回到Main,执行代码第15行,打印A.X和B.Y,就得到了以前你不知道怎么来的结果