public class A
    {
        public static int X = B.Y + 1;

        public static int SS = 20;

        static A()
        {
            X = 100;
        }

        public static void MainA()
        {
            System.Console.WriteLine(X);
            System.Console.WriteLine(SS);
        }
    }

    public class B
    {
        public static int Z = 10;

        public static int Y = 9;

        static B()
        {
            System.Console.WriteLine(Z);
            Y = A.X + 1;
        }
    }

请问以下执行结果X的结果是什么?

A.MainA();

答案是 100

执行顺序:

  1. A 初始化实例 执行第一行 X的初始化
  2. 用到B.Y,初始化B
  3. B 执行第一行 Z=10
  4. B执行Y=9;
  5. 执行静态构造B ,大于Z=10
  6. Y=A.X+1,由于A只初始化了还没有走下去,A.X为默认值0,所以Y=1。 最终Y就为1了
  7. 回到A中 X = B.Y + 1; 执行完 X=2;
  8. 执行A第二行 SS=20;
  9. 执行静态构造函数 X重置为100;
  10. 执行MainA函数 输出X=100,SS=20

结论

如果有静态构造函数的话 ,一定以这个处理结果为静态变量的最终数据。

顺序是:

静态变量执行=》静态构造函数执行

题目2

如果上面的方法执行两次呢?

A.MainA();
A.MainA();

答案:

第二次只执行MainA(); 因为A和B都已经在第一次执行时初始化完毕,不会再走静态构造函数了