Почему создается .ctor(), когда я компилирую код С# в IL?

С помощью этого простого кода С# я запускаю 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()? Кажется, он ничего не делает.

Ответы

Ответ 1

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

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

new Hello();

без ошибок.

Ответ 2

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

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

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

Ответ 3

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

public MyClass()
  :base()
{
}

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

Ответ 4

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

Ответ 5

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

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