[英]C# class instance field default value assignment plus default constructor equals double assignment?
我是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。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.