C#类实例字段默认值赋值加默认构造函数等于双赋值?

时间:2011-09-14 05:17:34

标签: c#

我是c#的新手并且读取了在默认构造函数调用之前初始化了实例字段。这是否意味着它们被双重初始化?

class MyClass
{
  public int value;

}

这是否意味着该值获得默认值0然后调用默认构造函数并再次分配0?

1 个答案:

答案 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

请注意ab但不是c的分配。通常,明确指定值0并将其保留为默认值之间的差异是不可观察的,但它存在于IL中。 (在调用基类构造函数之前决定调用某个虚方法的子类可以证明存在差异,但我怀疑这会违反CLS。)