Microsoft.Net框架程序设计学习笔记(11):类型构造器
时间:2011-03-27 来源:辛勤的代码工
除实例构造器外,CLR还支持类型构造器(又称静态构造器、类构造器、类型初始化器)。类型构造器用于设置一个类型的初始状态。默认情况下,一个类型中没有定义类型构造器,只能手动定义。且类型构造器不能有任何参数。
示例代码如下:
class SomeRefType
{
//当SomeRefType第一次被访问时执行
static SomeRefType()
{}
}
struct SomeValType
{
//当SomeValType第一次被访问时执行
static SomeValType()
{}
}
类型构造器不允许添加任何访问限制符,它的访问限制被自动设为私有方式。类型构造器的调用由CLR负责,CLR会在如下时间之一调用类型构造器。
- 在类型的第一个实例被创建之前,或在类型的非继承字段或成员第一次被访问前。
- 在非继承静态字段被第一次访问之前的某个时刻。
类型构造器一旦被执行,它在整个应用程序域的生命周期内都不会再次被调用 。
如果一个类型构造器抛出一个未处理异常,CLR将认为该类型不可用。试图访问其中的任何字段或方法都将抛出TypeInitializationException异常。
类型构造器的代码只能访问类型的静态字段,且通常它的目的就是初始化这些静态字段。
以下代码:
class SomeType当这段代码被编译时,编译器会为SomeType自动产生一个类型构造器,所以这段代码等价于如下代码:
{
static Int32 x = 5;
}
class SomeType还有一点要注意,类型构造器不应该调用其基类的类型构造器。这是因为基类中的静态字段没有被派生类型所继承。(这可能与大家的“认识”相反,因为很多代码或在派生类型内部引用了基类型的静态字段,或通过派生类型引用了基类的静态字段,这不是继承又是啥呢?事实上这确实不是继承,而是编译时静态绑定。另外,其他静态成员,如静态方法、静态属性等,也不会被派生类所继承,同样是编译时静态绑定。)
{
static Int32 x;
static SomeType() { x= 5; }
}
相关阅读 更多 +