.ctor:
简述:构造函数,在类被实例化时,它会被自动调用。
当C#的类被编译后,在IL代码中会出现一个名为.ctor的方法,它就是我们的构造函数,对应C#中的构造函数。且看下面的代码:
publicclassClass1
{
privatestringname;
privateintage;
}
类Class1中没有显示的构造函数,只有两字段,现在用ILDasm.exe打开编译后生成的exe文件,会看到:
可以看到这里有个.ctor,我们没有定义构造函数,但这里却出现了.ctor,这就说明了:
当没有显示定义构造函数时,会自动生成一个构造函数,它没有参数,没有返回值。
那我们来看看这个.ctor都干了什么吧,双击.ctor打开,在弹出的窗口中可以找到下面的几行代码:
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
上面就是这个.ctor的方法体,看上面的红色行,从字面上可以看出,它是调用(call)了一个类型为System.Object的实例的.ctor()方法,从这就可以证明:
当一个类没有显示声明继承于其它某个类时,它将默认继承自System.Object,并且,在类的构造函数中将会调用其基类的构造方法(.ctor)。
现在对上面的程序小改一下,在声明name时对其初始化:
publicclassClass1
{
privatestringname="Lin";
privateintage;
}
再用ILDasm打开生成的exe文件,打开.ctor,里面有这么几行:
IL_0000: ldarg.0
IL_0001: ldstr "Lin"
IL_0006: stfld string ConsoleApplication1.Class1::name
IL_000b: ldarg.0
IL_000c: call instance void [mscorlib]System.Object::.ctor()
IL_0011: nop
这个跟刚才的相比,多出了红色的那两行,这两行出现在“调用System.Object的构造方法”之前,这说明:
如果在字段声明的同时对其初始化,那么在编译后,赋值过程将被放到构造方法.ctor中,并且在调用其基类的构造方法之前进行。现在给上面的C#程序显式加上一个构造方法,它接受两个参数:
publicclassClass1