Почему это.ctor (), созданный при компиляции кода C# в IL?

С этим простым кодом 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 ответов


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

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

new Hello();

без ошибок.


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

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

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


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

public MyClass()
  :base()
{
}

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


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


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

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