Почему это.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, которую вы создаете, могут создать экземпляр вашего класса.
Если бы у него не было .чтор это может быть истолковано как личный .ктор, я полагаю. Обычно это довольно расплывчато. Но логически вы правы, в этом нет необходимости .чтор в этом случае.