我是c#的新手并且读取了在默认构造函数调用之前初始化了实例字段。这是否意味着它们被双重初始化?
class MyClass
{
public int value;
}
这是否意味着该值获得默认值0然后调用默认构造函数并再次分配0?
答案 0 :(得分:4)
不,编译器创建的无参数构造函数不会执行对字段的赋值,除非您指定了变量初始值设定项。所以在这样的课程中:
class Test
{
int a = 0;
int b = 1;
int c;
}
...生成的构造函数在IL中看起来像这样:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 22 (0x16)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4.0
IL_0002: stfld int32 Test::a
IL_0007: ldarg.0
IL_0008: ldc.i4.1
IL_0009: stfld int32 Test::b
IL_000e: ldarg.0
IL_000f: call instance void [mscorlib]System.Object::.ctor()
IL_0014: nop
IL_0015: ret
} // end of method Test::.ctor
请注意a
和b
但不是c
的分配。通常,明确指定值0
并将其保留为默认值之间的差异是不可观察的,但它存在于IL中。 (在调用基类构造函数之前决定调用某个虚方法的子类可以证明存在差异,但我怀疑这会违反CLS。)