为什么在将C#代码编译成IL时会创建.ctor()?

pro*_*eek 16 c# il csc ildasm

有了这个简单的C#代码,我就跑了csc hello.cs; ildasm /out=hello.txt hello.exe.

class Hello
{
    public static void Main()
    {
        System.Console.WriteLine("hi");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是来自ildasm的IL代码.

.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
Run Code Online (Sandbox Code Playgroud)

.method public instance void .ctor()代码有什么用?它似乎没有做任何事情.

Bol*_*ock 18

它是默认的无参数构造函数.你是对的; 它没有做任何事情(除了传递给基础Object()构造函数,无论如何它本身也没有做任何特殊的事情).

如果没有定义任何其他构造函数,编译器总是为非静态类创建默认构造函数.然后将任何成员变量初始化为默认值.这是你可以做到的

new Hello();
Run Code Online (Sandbox Code Playgroud)

没有遇到错误.


Jar*_*Par 5

这将在C#语言规范的第10.11.4节中介绍

如果类不包含实例构造函数声明,则会自动提供默认实例构造函数.该默认构造函数只是调用直接基类的无参数构造函数

这里Hello没有定义的构造函数,因此编译器会插入默认的do nothing构造函数,它只调用base/object版本