【问题标题】:Why is the .ctor() created when I compile C# code into IL?为什么将 C# 代码编译成 IL 时会创建 .ctor()?
【发布时间】:2011-11-06 07:51:31
【问题描述】:

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

【问题讨论】:

    标签: c# il csc ildasm


    【解决方案1】:

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

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

    new Hello();
    

    不会出错。

    【讨论】:

    【解决方案2】:

    C# 语言规范的第 10.11.4 节对此进行了介绍

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

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

    【讨论】:

      【解决方案3】:

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

      public MyClass()
        :base()
      {
      }
      

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-10-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多