除实例构造器外,CLR还支持类型构造器(又称静态构造器、类构造器、类型初始化器)。类型构造器用于设置一个类型的初始状态。默认情况下,一个类型中没有定义类型构造器,只能手动定义。且类型构造器不能有任何参数。
示例代码如下:
class SomeRefType
{
//当SomeRefType第一次被访问时执行
static SomeRefType()
{}
}
struct SomeValType
{
//当SomeValType第一次被访问时执行
static SomeValType()
{}
}
{
//当SomeRefType第一次被访问时执行
static SomeRefType()
{}
}
struct SomeValType
{
//当SomeValType第一次被访问时执行
static SomeValType()
{}
}
类型构造器不允许添加任何访问限制符,它的访问限制被自动设为私有方式。类型构造器的调用由CLR负责,CLR会在如下时间之一调用类型构造器。
- 在类型的第一个实例被创建之前,或在类型的非继承字段或成员第一次被访问前。
- 在非继承静态字段被第一次访问之前的某个时刻。
类型构造器一旦被执行,它在整个应用程序域的生命周期内都不会再次被调用 。
如果一个类型构造器抛出一个未处理异常,CLR将认为该类型不可用。试图访问其中的任何字段或方法都将抛出TypeInitializationException异常。
类型构造器的代码只能访问类型的静态字段,且通常它的目的就是初始化这些静态字段。
以下代码:
class SomeType
{
static Int32 x = 5;
}
{
static Int32 x = 5;
}
class SomeType
{
static Int32 x;
static SomeType() { x= 5; }
}
{
static Int32 x;
static SomeType() { x= 5; }
}