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

c# il csc ildasm

9996 просмотра

5 ответа

71429 Репутация автора

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

Автор: prosseek Источник Размещён: 29.08.2011 08:29

Ответы (5)


18 плюса

557783 Репутация автора

Решение

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

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

new Hello();

не сталкиваясь с ошибками.

Автор: BoltClock Размещён: 29.08.2011 08:30

2 плюса

92987 Репутация автора

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

public MyClass()
  :base()
{
}

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

Автор: CodesInChaos Размещён: 29.08.2011 08:32

0 плюса

9486 Репутация автора

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

Автор: larsmoa Размещён: 29.08.2011 08:32

0 плюса

2032 Репутация автора

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

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

Автор: Dlongnecker Размещён: 29.08.2011 08:33

5 плюса

610430 Репутация автора

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

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

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

Автор: JaredPar Размещён: 29.08.2011 08:37
Вопросы из категории :
32x32