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

本文关键字:赋值 默认 构造函数 于双 实例 字段 默认值 | 更新日期: 2023-09-27 18:08:36

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

class MyClass
{
  public int value;
}

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

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

不,编译器创建的无参数构造函数不会对字段执行赋值,除非指定了变量初始化器。在这样的类中:

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。)