有了这个简单的C#代码,我就跑了csc hello.cs; ildasm /out=hello.txt hello.exe.
class Hello
{
public static void Main()
{
System.Console.WriteLine("hi");
}
}
Run Code Online (Sandbox Code Playgroud)
这是来自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
Run Code Online (Sandbox Code Playgroud)
.method public instance void .ctor()代码有什么用?它似乎没有做任何事情.
Bol*_*ock 18
它是默认的无参数构造函数.你是对的; 它没有做任何事情(除了传递给基础Object()构造函数,无论如何它本身也没有做任何特殊的事情).
如果没有定义任何其他构造函数,编译器总是为非静态类创建默认构造函数.然后将任何成员变量初始化为默认值.这是你可以做到的
new Hello();
Run Code Online (Sandbox Code Playgroud)
没有遇到错误.
这将在C#语言规范的第10.11.4节中介绍
如果类不包含实例构造函数声明,则会自动提供默认实例构造函数.该默认构造函数只是调用直接基类的无参数构造函数
这里Hello没有定义的构造函数,因此编译器会插入默认的do nothing构造函数,它只调用base/object版本
| 归档时间: |
|
| 查看次数: |
10018 次 |
| 最近记录: |