Почему .ctor () создается, когда я компилирую код C # в IL? - PullRequest
16 голосов
/ 30 августа 2011

С помощью этого простого кода на C # я запускаю csc hello.cs; ildasm /out=hello.txt hello.exe.

class Hello
{
    public static void Main()
    {
        System.Console.WriteLine("hi");
    }
}

Это код IL от ildasm.

.class private auto ansi beforefieldinit Hello
       extends [mscorlib]System.Object
{
  .method public hidebysig static void  Main() cil managed
  {
    .entrypoint
    // Code size       13 (0xd)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ldstr      "hi"
    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000b:  nop
    IL_000c:  ret
  } // end of method Hello::Main

  .method public hidebysig specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    // Code size       7 (0x7)
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    IL_0006:  ret
  } // end of method Hello::.ctor

} // end of class Hello

Какая польза от кода .method public instance void .ctor()? Кажется, он ничего не делает.

Ответы [ 5 ]

18 голосов
/ 30 августа 2011

Это конструктор по умолчанию без параметров. Вы правы; он ничего не делает (кроме перехода к базовому конструктору Object(), который сам по себе ничего особенного не делает)

Компилятор всегда создает конструктор по умолчанию для нестатического класса, если другой конструктор не определен. Любые переменные-члены затем инициализируются по умолчанию. Это так, вы можете сделать

new Hello();

без ошибок.

5 голосов
/ 30 августа 2011

Это описано в разделе 10.11.4 спецификации языка C #

Если класс не содержит объявлений конструктора экземпляра, автоматически предоставляется конструктор экземпляра по умолчанию. Этот конструктор по умолчанию просто вызывает конструктор без параметров прямого базового класса

Здесь Hello не имеет определенного конструктора, поэтому компилятор вставляет конструктор по умолчанию, который ничего не делает, который просто вызывает базовую / объектную версию

2 голосов
/ 30 августа 2011

Класс, для которого вы не определяете конструктор, получает неявный открытый конструктор по умолчанию.

public MyClass()
  :base()
{
}

Это работает, только если базовый класс имеет доступный конструктор без параметров.

0 голосов
/ 30 августа 2011

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

Если у него нет .ctor, то, я полагаю, он может быть истолкован как имеющий частный .ctorЭто вообще довольно расплывчато.Но по логике вы правы, в этом случае вам не нужен .ctor.

0 голосов
/ 30 августа 2011

класс Hello наследует объект, сгенерированный по умолчанию конструктор просто вызывает конструктор класса object.

...