在C#中,初始化类成员时是否生成默认构造函数?

在C#中,初始化类成员时是否生成默认构造函数?,c#,constructor,initialization,C#,Constructor,Initialization,假设我初始化一个类的成员,如下所示: class A { public int i=4; public double j=6.0; } 在这种情况下,编译器是否生成默认构造函数 一般来说,我知道构造函数可以初始化类实例变量的值,还可以执行一些适合该类的其他初始化操作。但是在上面的例子中,我已经在构造函数外部初始化了I和j的值。在这种情况下,编译器是否仍然生成默认构造函数?如果是,默认构造函数做什么?在这种情况下,编译器仍会生成默认构造函数。构造函数处理i和j的初始化。如果你看

假设我初始化一个类的成员,如下所示:

class A 
{
    public int i=4;
    public double j=6.0;
}
在这种情况下,编译器是否生成默认构造函数


一般来说,我知道构造函数可以初始化类实例变量的值,还可以执行一些适合该类的其他初始化操作。但是在上面的例子中,我已经在构造函数外部初始化了
I
j
的值。在这种情况下,编译器是否仍然生成默认构造函数?如果是,默认构造函数做什么?

在这种情况下,编译器仍会生成默认构造函数。构造函数处理i和j的初始化。如果你看一下IL,这是显而易见的

.class auto ansi nested private beforefieldinit A
   extends [mscorlib]System.Object
{
   .method public hidebysig specialname rtspecialname instance void .ctor() cil managed
   {
      .maxstack 8
      L_0000: ldarg.0 // pushes "this" onto the stack
      L_0001: ldc.i4.4 // pushes 4 (as Int32) onto the stack
      L_0002: stfld int32 TestApp.Program/A::i // assigns to i (this.i=4)
      L_0007: ldarg.0 // pushes "this" onto the stack
      L_0008: ldc.r8 6 // pushes 6 (as Double) onto the stack
      L_0011: stfld float64 TestApp.Program/A::j // assigns to j (this.j=6.0)
      L_0016: ldarg.0 // pushes "this" onto the stack
      L_0017: call instance void [mscorlib]System.Object::.ctor() // calls the base-ctor
      /* if you had a custom constructor, the body would go here */
      L_001c: ret // and back we go
   }

将首先运行上面的变量初始化。然后,构造函数中的任何内容都将在后面运行。

您可以在中阅读这些内容。第17.4.5章讨论了这个具体问题,基本上说字段将默认初始化为该类型具有的任何默认值(在您的情况下分别为0或0.0),然后将按照在源文件中声明的顺序执行值初始化。

为OP注释;我已经对你的问题进行了显著的编辑,以澄清我认为你想问的问题,并可能引起更多的关注。如果我误判了您的意图,请回滚我的编辑或进一步编辑。