静态构造函数操作的是类(而非其实例的)成员。
静态构造函数(.cctor)的一些特点:
1. 声明和定义形式上,只能有static一个修饰符,不能有任何修饰符和返回值(也不能有void)。
2. 不能被显示调用,由CLR调用。
3. 最多只能调用一次。
4. 静态构造函数中只能调用静态字段和静态属性,方法等,不能操作实例字段,属性,方法等。
5. 静态构造函数需要时必须显示定义,只能最多一个。
6. 如果静态字段有直接赋值语句,并且定义了静态构造函数,则生成的IL中,会先执行该赋值语句,然后执行静态构造函数的中的代码。
7. 不同于实例构造函数,静态构造函数生成的代码中,不含有对基类任何构造函数的调用。
8. 如果定义了静态构造函数,则静态构造函数的调用一定会在实例构造函数调用之前发生(由于对基类的实例构造函数的调用是在派生类的实例构造函数中,故而,如果基类有静态构造函数但基类尚未被加载,则基类的静态构造函数的调用依然晚于派生类的静态构造函数。基类的静态构造函数调用发生在派生类的构造函数生成的IL中,内联初始化实例字段后,基类实例构造函数调用之前)。
9. 没有显示声明静态构造函数时,即使有静态字段,生成的IL中也不一定有静态构造函数.cctor,但CLR会在运行时执行一个系统生成的.cctor。调用的时机是程序集加载到类第一次被实例化(或类静态成员第一次被调用)之前,但时机由CLR决定,无法准确判断。
10. 若显示声明了静态构造函数,则静态构造函数的调用实际是在类静态第一次被访问或者类第一次被实例化(即类加载时),只会被调用这一次。
11. 可以看出,静态构造函数的调用发生在类加载时,且在实例构造函数调用之前。