在网上看到一个经典的关于静态构造函数的问题:
class A
{ public static int X = B.Y + 1; static A() { Console.WriteLine("static A: x={0}", X); //X = B.Y + 1; } static void Main(string[] args) { Console.WriteLine(X); } }class B
{ public static int Z = 10;public static int Y =A.X + 1;
static B()
{ Console.WriteLine("Static B: Y = {0}",Y); //Y = A.X + Z; } }
输出为:
Static B: Y = 1;
static A: x= 2;2
分析:
因为Main函数在classA中,所以在程序执行的时候肯定会用到A,而A中有静态变量X,那么会先初始化静态变量,然后在调用其构造函数。在初始化X的时候,发现用到了B,同理先初始化B中的Z和Y,然后调用B的静态构造函数。 很重要的一点是在静态构造函数调用之前就初始化了静态变量。其实在Main函数中什么都不执行同样会输出一样的结果。
static void Main(string[] args) { //Console.WriteLine(X); }因为静态构造函数是变量被引用的时候调用一次。
对于C#静态变量初始化,那么如果类中存在静态构造函数则静态字段初始值设定项的执行在该静态构造函数即将执行前发生。
C#高效编程里说到,这样一段话:创建某个类型的第一个实例时,所进行的操作顺序为:1.静态变量设置为02.执行静态变量初始化器3.执行基类的静态构造函数4.执行静态构造函数5.实例变量设置为06.执行衯变量初始化器7.执行基类中合适的实例构造函数8.执行实例构造函数同样类型的第二个以及以后的实例将从第五步开始执行