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

为什么在我将C#代码编译成IL时会创建.ctor()?,c#,il,csc,ildasm,C#,Il,Csc,Ildasm,使用这个简单的C代码,我运行csc hello.cs;ildasm/out=hello.txt hello.exe class Hello { public static void Main() { System.Console.WriteLine("hi"); } } 这是ildasm的IL代码 .class private auto ansi beforefieldinit Hello extends [mscorlib]System.

使用这个简单的C代码,我运行
csc hello.cs;ildasm/out=hello.txt hello.exe

class Hello
{
    public static void Main()
    {
        System.Console.WriteLine("hi");
    }
}
这是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

.method public instance void.ctor()
code有什么用?它似乎没有任何作用。

它是默认的无参数构造函数。你是对的;它不做任何事情(除了传递给基
对象()
构造函数之外,它本身也不做任何特殊的事情)

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

new Hello();

不会出现错误。

未定义构造函数的类将获得隐式公共默认构造函数

public MyClass()
  :base()
{
}

这仅在基类具有可访问的无参数构造函数时有效。

类Hello继承对象,默认生成的构造函数只调用类
对象的构造函数

我可以想象规范规定,由于类本身不是静态或抽象的,它必须公开默认的无参数构造函数。这样,您构建的任何库或PE的其他用户都可以实例化您的类的副本

public MyClass()
  :base()
{
}

如果它没有.ctor,我想它可以被解释为有一个私有的.ctor。这通常是相当模糊的。但是从逻辑上讲,您是对的,在本例中不需要.ctor。

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

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


在这里,
Hello
没有定义的构造函数,因此编译器插入默认的不做任何事情的构造函数,它只调用基本/对象版本

更多关于默认构造函数:这也意味着询问者可以通过使他的类成为静态的来摆脱它:
static class Hello{…}