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

使用这个简单的C#代码,我运行csc hello.cs; ildasm /out=hello.txt hello.exe 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()代码有什么用? 它似乎没有做任何事情。

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

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

 new Hello(); 

没有遇到错误。

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

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

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

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

 public MyClass() :base() { } 

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

class Helloinheritance对象,默认生成的构造函数只是调用类object的构造object

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

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