我是 c# 的新手,读到实例字段在默认构造函数调用之前被初始化。这是否意味着它们被双重初始化?
class MyClass
{
public int value;
}
这是否意味着该值获取默认值 0 然后调用默认构造函数并再次分配 0?
最佳答案
不,编译器创建的无参数构造函数不会执行字段赋值,除非您指定变量初始值设定项。所以在这样的类中:
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。)
关于C# 类实例字段默认值赋值加上默认构造函数等于双重赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7411575/