17

使用这个简单的 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()?它似乎没有做任何事情。

4

5 回答 5

19

它是默认的无参数构造函数。你是对的;它什么都不做(除了传递给基本Object()构造函数,它本身也没有做任何特别的事情)。

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

new Hello();

没有遇到错误。

于 2011-08-29T20:30:48.567 回答
5

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

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

这里Hello没有定义的构造函数,因此编译器插入了默认的什么都不做的构造函数,它只调用基/对象版本

于 2011-08-29T20:37:04.973 回答
2

您没有为其定义构造函数的类将获得一个隐式的公共默认构造函数。

public MyClass()
  :base()
{
}

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

于 2011-08-29T20:32:33.007 回答
0

class Hello 继承 object,默认生成的构造函数只是调用 class 的构造函数object

于 2011-08-29T20:32:38.420 回答
0

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

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

于 2011-08-29T20:33:59.437 回答