类的构造函数执行顺序简介: 执行派生类某构造函数D时,CLR 会先调用其基类与D 签名相同的构造函数。这个调用会从顶级的Object 类开始,依次往下,直至最后调用构造函数D。
定义如下一个类DerivedType
三个构造函数生成的IL 代码,其中的字段初始化语句是相同的,即都包含如下IL 代码
很显然,这样初始化字段会导致IL 代码臃肿。
解决的方法是:将这些字段的初始化语句放在一个单独的公共初始化构造函数中,并让其他重载的构造函数显式调用这个公共初始化构造函数:
以上三个构造函数生成的IL 代码如
下:
定义如下一个类DerivedType
internal
class
DerivedType
{
private Int32 m_i = 10;
private String m_s = "Hithere";
private Double m_d = 3.14159;
private Byte m_b;
public DerivedType() {
}
public DerivedType(Int32 x) {
}
public DerivedType(String s) {
}
}
{
private Int32 m_i = 10;
private String m_s = "Hithere";
private Double m_d = 3.14159;
private Byte m_b;
public DerivedType() {
}
public DerivedType(Int32 x) {
}
public DerivedType(String s) {
}
}
IL_0000: ldarg.
0
IL_0001: ldc.i4.s 10
IL_0003: stfld int32 HaiShui.Constructor.DerivedType::m_i
IL_0008: ldarg. 0
IL_0009: ldstr " Hithere "
IL_000e: stfld string HaiShui.Constructor.DerivedType::m_s
IL_0013: ldarg. 0
IL_0014: ldc.r8 3.1415899999999999
IL_001d: stfld float64 HaiShui.Constructor.DerivedType::m_d
IL_0022: ldarg. 0
IL_0023: call instance void [mscorlib]System.Object::.ctor()
IL_0001: ldc.i4.s 10
IL_0003: stfld int32 HaiShui.Constructor.DerivedType::m_i
IL_0008: ldarg. 0
IL_0009: ldstr " Hithere "
IL_000e: stfld string HaiShui.Constructor.DerivedType::m_s
IL_0013: ldarg. 0
IL_0014: ldc.r8 3.1415899999999999
IL_001d: stfld float64 HaiShui.Constructor.DerivedType::m_d
IL_0022: ldarg. 0
IL_0023: call instance void [mscorlib]System.Object::.ctor()
解决的方法是:将这些字段的初始化语句放在一个单独的公共初始化构造函数中,并让其他重载的构造函数显式调用这个公共初始化构造函数:
internal
class
DerivedType
{
private Int32 m_i;
private String m_s;
private Double m_d ;
private Byte m_b;
// 公共初始化构造函数:初始化类的所有字段
public DerivedType() {
m_i = 10;
m_s = "God";
m_d = 3.14159;
m_b = 0;
}
// 显式调用公共初始化构造函数
public DerivedType(Int32 i) :this(){
m_i = i;
}
// 显式调用公共初始化构造函数
public DerivedType(String s,Double d) :this(){
m_s = s;
m_d = d;
}
}
{
private Int32 m_i;
private String m_s;
private Double m_d ;
private Byte m_b;
// 公共初始化构造函数:初始化类的所有字段
public DerivedType() {
m_i = 10;
m_s = "God";
m_d = 3.14159;
m_b = 0;
}
// 显式调用公共初始化构造函数
public DerivedType(Int32 i) :this(){
m_i = i;
}
// 显式调用公共初始化构造函数
public DerivedType(String s,Double d) :this(){
m_s = s;
m_d = d;
}
}
以上三个构造函数生成的IL 代码如
.method
public
hidebysig specialname rtspecialname
instance void .ctor(int32 i) cil managed
{
// Code size 14 (0xe)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void HaiShui.Constructor.DerivedType::.ctor()
IL_0006: ldarg.0
IL_0007: ldarg.1
IL_0008: stfld int32 HaiShui.Constructor.DerivedType::m_i
IL_000d: ret
} // end of method DerivedType::.ctor
instance void .ctor(int32 i) cil managed
{
// Code size 14 (0xe)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void HaiShui.Constructor.DerivedType::.ctor()
IL_0006: ldarg.0
IL_0007: ldarg.1
IL_0008: stfld int32 HaiShui.Constructor.DerivedType::m_i
IL_000d: ret
} // end of method DerivedType::.ctor
.method
public
hidebysig specialname rtspecialname
instance void .ctor( string s,
float64 d) cil managed
{
// Code size 21 (0x15)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void HaiShui.Constructor.DerivedType::.ctor()
IL_0006: ldarg.0
IL_0007: ldarg.1
IL_0008: stfld string HaiShui.Constructor.DerivedType::m_s
IL_000d: ldarg.0
IL_000e: ldarg.2
IL_000f: stfld float64 HaiShui.Constructor.DerivedType::m_d
IL_0014: ret
} // end of method DerivedType::.ctor
instance void .ctor( string s,
float64 d) cil managed
{
// Code size 21 (0x15)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void HaiShui.Constructor.DerivedType::.ctor()
IL_0006: ldarg.0
IL_0007: ldarg.1
IL_0008: stfld string HaiShui.Constructor.DerivedType::m_s
IL_000d: ldarg.0
IL_000e: ldarg.2
IL_000f: stfld float64 HaiShui.Constructor.DerivedType::m_d
IL_0014: ret
} // end of method DerivedType::.ctor
.method
public
hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 48 (0x30)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ldarg.0
IL_0007: ldc.i4.s 10
IL_0009: stfld int32 HaiShui.Constructor.DerivedType::m_i
IL_000e: ldarg.0
IL_000f: ldstr "God"
IL_0014: stfld string HaiShui.Constructor.DerivedType::m_s
IL_0019: ldarg.0
IL_001a: ldc.r8 3.1415899999999999
IL_0023: stfld float64 HaiShui.Constructor.DerivedType::m_d
IL_0028: ldarg.0
IL_0029: ldc.i4.0
IL_002a: stfld uint8 HaiShui.Constructor.DerivedType::m_b
IL_002f: ret
} // end of method DerivedType::.ctor
instance void .ctor() cil managed
{
// Code size 48 (0x30)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ldarg.0
IL_0007: ldc.i4.s 10
IL_0009: stfld int32 HaiShui.Constructor.DerivedType::m_i
IL_000e: ldarg.0
IL_000f: ldstr "God"
IL_0014: stfld string HaiShui.Constructor.DerivedType::m_s
IL_0019: ldarg.0
IL_001a: ldc.r8 3.1415899999999999
IL_0023: stfld float64 HaiShui.Constructor.DerivedType::m_d
IL_0028: ldarg.0
IL_0029: ldc.i4.0
IL_002a: stfld uint8 HaiShui.Constructor.DerivedType::m_b
IL_002f: ret
} // end of method DerivedType::.ctor