Почему создается .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.