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

标签 c#

我是 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

请注意对ab 的赋值,而不是对c 的赋值。通常显式分配 0 值和将其保留为默认值之间的区别是不可观察的,但它存在于 IL 中。 (一个子类决定在 调用基类构造函数之前调用一些虚拟方法可以证明差异,尽管我怀疑这会违反 CLS。)

关于C# 类实例字段默认值赋值加上默认构造函数等于双重赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7411575/

相关文章:

c# - 解析通过 asp :FileUpload 上传的 XML 文件

c# - 如何为 T4 生成的代码设置默认命名空间

c# - 你如何制作一个完全方形的按钮?

c# - Application.Exit 上的 InvalidOperationException

c# - 使用 where 将 foreach 转换为 LINQ 语句

c# - 将动态类型与 LINQ 结合使用

c# - 如何在折线图中显示附加点信息?

c# - 在类库中隐藏仅包含内部类型的 namespace ?

C# 扩展索引器?

c# - 从 Bcrypt 散列密码中检索文本