C# 类型构造器 (type constructor)[1]
🏷️ C#
类型构造器 (type constructor),也称为静态构造器(static constructor)、类构造器(class constructor)或者类型初始化器(type initializer)。
类型构造器可应用于接口(虽然C#编译器不允许)、引用类型和值类型。
在之前的 《C# 值类型构造函数》 里说过,值类型不允许有自己的无参实例构造器,但是允许有自己的类型构造器。
示例代码:构建一个引用类型和一个值类型以作对比,各自拥有一个静态构造函数。
csharp
class SomeRefType
{
static SomeRefType()
{
}
}
struct SomeValType
{
static SomeValType()
{
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
点击查看 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
上面的 cctor
方法即编译后的静态构造函数的 IL 代码,修饰为 private static
。
下面是关于类型构造器的注意点:
类型默认不定义类型构造器;
如果定义,也只能定义一个;
类型构造器永远没有参数;
类型构造器总是私有的(C# 自动把它标记为
private
);静态构造函数中不允许出现访问修饰符(即使标记为
private
也不行);