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

时间:2011-08-29 20:29:52

标签: 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.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 个答案:

答案 0 :(得分:18)

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

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

new Hello();

没有遇到错误。

答案 1 :(得分:5)

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

  

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

的无参数构造函数

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

答案 2 :(得分:2)

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

public MyClass()
  :base()
{
}

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

如果它没有.ctor,我想它可以被解释为拥有私人.ctor。这通常很模糊。但从逻辑上讲,你是对的,在这种情况下不需要.ctor。