类型构造函数
您应该很熟悉构造函数,它负责设置对象实例的初始状态。除了实例构造函数,Microsoft® .NET 公共语言运行库(common language runtime,CLR)还支持类型构造函数(也称为静态构造函数、类构造函数、或者类型初始函数)。类型构造函数可以用于接口、类和值类型。它允许类型在任何成员被访问前进行所需的初始化工作。类型构造函数不接受任何参数,返回类型必须是 void。类型构造函数仅访问类型的静态字段,并且其通常的用途是初始化这些字段。类型构造函数确保在类型的任何实例创建前,以及在类型的任何静态字段或者方法被引用前运行。
许多语言(包括 C#)自动为任何定义的类型产生类型构造函数。但是,有些语言需要显式实现类型构造函数。
为了理解类型构造函数,查看下面的类型(用 C# 定义):
class AType { static int x = 5; }
在生成该段代码时,编译器自动为 AType 产生一个类型构造函数。该构造函数负责将静态字段 x 的值初始化为 5。如果使用 ILDasm,可以很容易地发现类型构造函数方法,因为它们的名字是 .cctor(即 class constructor)。
在 C# 中,您可以在类型中定义一个静态的构造函数方法来亲自实现类型构造函数。使用 static 关键字让该构造函数成为一个类型构造函数而不是实例构造函数。下面是一个很简单的例子:
class AType { static int x; static AType() { x = 5; } }
该类型定义与前面的相同。注意,类型构造函数永远不能试图创建其自身类型的实例,并且构造函数不能引用任何此类型的非静态成员。
最后,对于以下代码,C# 编译器只产生一个类型构造函数方法。
class AType { static int x = 5; static AType() { x = 10; } }
该构造函数首先将 x 初始化为 5,然后将 x 初始化为 10。换句话说,编译器最终产生的类型构造函数首先包含静态字段的初始化代码,然后才是类型构造函数方法中的代码。