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