您的位置:首页 > 编程语言

构造函数是怎样初始化字段的--减少所生成代码的大小

2007-11-10 11:13 555 查看
类的构造函数执行顺序简介: 执行派生类某构造函数D时,CLR 会先调用其基类与D 签名相同的构造函数。这个调用会从顶级的Object 类开始,依次往下,直至最后调用构造函数D。

定义如下一个类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) ...{


}


}

三个构造函数生成的IL 代码,其中的字段初始化语句是相同的,即都包含如下IL 代码


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 代码臃肿。
解决的方法是:将这些字段的初始化语句放在一个单独的公共初始化构造函数中,并让其他重载的构造函数显式调用这个公共初始化构造函数:


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;


}


}

以上三个构造函数生成的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




.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

下:


.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐