类中关于静态构造函数的执行顺序
刚刚使用静态类中的静态构造函数,有一些不太懂的地方,于是google了一下,看了一些文章,把自己的一些总结发上来吧。
google的初衷就是因为这个:
在类中初始化成员到底是直接初始化还是在类的静态构造函数中初始化呢?
还是先把最终的建议给展示出来:
第一就是简单静态成员,例如类型为值类型等,使用成员初始化语句来完成;
第二静态成员初始化比较复杂,或者有可能出现异常,那么用静态构造函数来完成。
下面是在网上找的一个例子,主要是熟悉下静态构造函数的执行顺序:
static class A
{
public static int X = B.Y;
static A()
{
++X;
}
}
static class B
{
public static int Y = A.X;
static B()
{
++Y;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(A.X);
Console.WriteLine(B.Y);
Console.Read();
}
}
不卖关子,先说下执行结果
2
1
下面来解释下:首先执行Console.WriteLine(A.X),于是,便会跳到类A中去,因为调用了成员X,于是先给X分配空间,并初始化为0,于是又执行X = B.Y这句,执行时候变跳到了类B中,首先也是初始化成员Y,并初始化为0,继续执行Y = A.X,因为A.X已经初始化为0了,所以直接Y=0,接着再执行类B的静态构造函数,于是Y变成了1,执行完后在回到X=B.Y这句中,以为B.Y==1,所以X=1,然后再执行A类的静态构造函数,于是A.X==2了。
可能上面有些绕,其实执行顺序就是,先初始化类中的静态成员,然后在执行类的静态构造函数,执行顺序:类的静态成员>类的静态构造函数。
一上就上对静态构造函数的一些理解。