В C # конструктор по умолчанию генерируется при инициализации членов класса? - PullRequest
5 голосов
/ 06 сентября 2010

Предположим, я инициализирую членов класса следующим образом:

class A 
{
    public int i=4;
    public double j=6.0;
}

В этой ситуации компилятор создает конструктор по умолчанию?

В общем, я знаю, что конструктор может инициализировать значение переменных экземпляра класса, а также может выполнять некоторые другие операции инициализации, подходящие для класса. Но в приведенном выше примере я инициализировал значения i и j вне конструктора. В этой ситуации компилятор все еще генерирует конструктор по умолчанию? Если так, что делает конструктор по умолчанию?

Ответы [ 3 ]

11 голосов
/ 06 сентября 2010

Компилятор все еще генерирует конструктор по умолчанию в этом случае. Конструктор обрабатывает инициализацию 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
   }
3 голосов
/ 06 сентября 2010

Вы можете прочитать это в официальном стандарте ECMA .Глава 17.4.5 говорит об этой конкретной проблеме, в основном заявляя, что поля будут инициализированы по умолчанию с любым значением по умолчанию, которое имеет тип (0 или 0.0, соответственно, в вашем случае), и после этого инициализация значения будет выполняться в том порядке, в которомобъявлены в исходном файле.

0 голосов
/ 06 сентября 2010

указанная выше инициализация переменной будет выполняться первой.Тогда все, что у вас есть в конструкторе, будет запущено после.

...