Skip to content

C# 类型构造器 (type constructor)[1]

🏷️ C#

类型构造器 (type constructor),也称为静态构造器(static constructor)、类构造器(class constructor)或者类型初始化器(type initializer)。

类型构造器可应用于接口(虽然C#编译器不允许)、引用类型和值类型。

在之前的 《C# 值类型构造函数》 里说过,值类型不允许有自己的无参实例构造器,但是允许有自己的类型构造器。

示例代码:构建一个引用类型和一个值类型以作对比,各自拥有一个静态构造函数。

csharp
class SomeRefType
{
    static SomeRefType()
    {
    }
}
struct SomeValType
{
    static SomeValType()
    {
    }
}
点击查看 IL 代码
cs
.class private auto ansi ClassCctorSample.SomeRefType
       extends [mscorlib]System.Object
{
  .method private hidebysig specialname rtspecialname static 
          void  .cctor() cil managed
  {
    // 代码大小       2 (0x2)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ret
  } // end of method SomeRefType::.cctor

  .method public hidebysig specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    // 代码大小       7 (0x7)
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    IL_0006:  ret
  } // end of method SomeRefType::.ctor

} // end of class ClassCctorSample.SomeRefType

.class private sequential ansi sealed ClassCctorSample.SomeValType
       extends [mscorlib]System.ValueType
{
  .pack 0
  .size 1
  .method private hidebysig specialname rtspecialname static 
          void  .cctor() cil managed
  {
    // 代码大小       2 (0x2)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ret
  } // end of method SomeValType::.cctor

} // end of class ClassCctorSample.SomeValType

上面的 cctor 方法即编译后的静态构造函数的 IL 代码,修饰为 private static

下面是关于类型构造器的注意点:

  • 类型默认不定义类型构造器;

  • 如果定义,也只能定义一个;

  • 类型构造器永远没有参数;

  • 类型构造器总是私有的(C# 自动把它标记为 private);

  • 静态构造函数中不允许出现访问修饰符(即使标记为 private 也不行);