Microsoft.Net框架程序设计学习笔记(11):类型构造器

  除实例构造器外,CLR还支持类型构造器(又称静态构造器、类构造器、类型初始化器)。类型构造器用于设置一个类型的初始状态。默认情况下,一个类型中没有定义类型构造器,只能手动定义。且类型构造器不能有任何参数。

  示例代码如下:

  
    
class SomeRefType
{
// 当SomeRefType第一次被访问时执行
static SomeRefType()
{}
}

struct SomeValType
{
// 当SomeValType第一次被访问时执行
static SomeValType()
{}
}

  类型构造器不允许添加任何访问限制符,它的访问限制被自动设为私有方式。类型构造器的调用由CLR负责,CLR会在如下时间之一调用类型构造器。

  1. 在类型的第一个实例被创建之前,或在类型的非继承字段或成员第一次被访问前。
  2. 在非继承静态字段被第一次访问之前的某个时刻。

  类型构造器一旦被执行,它在整个应用程序域的生命周期内都不会再次被调用 。

  如果一个类型构造器抛出一个未处理异常,CLR将认为该类型不可用。试图访问其中的任何字段或方法都将抛出TypeInitializationException异常。

  类型构造器的代码只能访问类型的静态字段,且通常它的目的就是初始化这些静态字段。

  以下代码:

  
    
class SomeType
{
static Int32 x = 5 ;
}
  当这段代码被编译时,编译器会为SomeType自动产生一个类型构造器,所以这段代码等价于如下代码:
  
    
class SomeType
{
static Int32 x;
static SomeType() { x = 5 ; }
}
  还有一点要注意,类型构造器不应该调用其基类的类型构造器。这是因为基类中的静态字段没有被派生类型所继承。(这可能与大家的“认识”相反,因为很多代码或在派生类型内部引用了基类型的静态字段,或通过派生类型引用了基类的静态字段,这不是继承又是啥呢?事实上这确实不是继承,而是编译时静态绑定。另外,其他静态成员,如静态方法、静态属性等,也不会被派生类所继承,同样是编译时静态绑定。)

你可能感兴趣的:(Microsoft)