为什么在我将C#代码编译成IL时会创建.ctor()?
使用这个简单的C代码,我运行为什么在我将C#代码编译成IL时会创建.ctor()?,c#,il,csc,ildasm,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.
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()
code有什么用?它似乎没有任何作用。它是默认的无参数构造函数。你是对的;它不做任何事情(除了传递给基对象()
构造函数之外,它本身也不做任何特殊的事情)
如果没有定义任何其他构造函数,编译器总是为非静态类创建默认构造函数。然后将所有成员变量初始化为默认值。这就是你能做的
new Hello();
不会出现错误。未定义构造函数的类将获得隐式公共默认构造函数
public MyClass()
:base()
{
}
这仅在基类具有可访问的无参数构造函数时有效。类Hello继承对象,默认生成的构造函数只调用类
对象的构造函数
我可以想象规范规定,由于类本身不是静态或抽象的,它必须公开默认的无参数构造函数。这样,您构建的任何库或PE的其他用户都可以实例化您的类的副本
public MyClass()
:base()
{
}
如果它没有.ctor,我想它可以被解释为有一个私有的.ctor。这通常是相当模糊的。但是从逻辑上讲,您是对的,在本例中不需要.ctor。这在C语言规范的第10.11.4节中有介绍 如果类不包含实例构造函数声明,则会自动提供默认实例构造函数。默认构造函数只调用直接基类的无参数构造函数
在这里,
Hello
没有定义的构造函数,因此编译器插入默认的不做任何事情的构造函数,它只调用基本/对象版本更多关于默认构造函数:这也意味着询问者可以通过使他的类成为静态的来摆脱它:static class Hello{…}