构造函数是怎样初始化字段的--减少所生成代码的大小
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
定义如下一个类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
相关文章推荐
- IIS6.0日志文件分析代码_1生成访问字段记录到数组中
- c#新手入门级代码分享 在类进行实例化的时候初始化字段
- Android中实现自动生成布局View的初始化代码方法
- 代码自动生成(二)数据库表字段生成mybaties 映射配置文件**mapper.xml
- QStringLiteral(源代码里有一个通过构造函数产生的从const char*到QString的隐式转换,QStringLiteral字符串可以放在代码的任何地方,编译期直接生成utf16字符串,速度很快,体积变大)
- javascript生成 解析dom的CDATA类型的字段的代码
- 浅谈静态字段与静态构造函数之间的初始化关系以及执行顺序
- 读取数据库信息构建视图字段的备注信息,方便程序代码生成
- 编译器不会自动生成调用基类复制构造函数的代码
- 拨云见日---浅谈静态字段与静态构造函数之间的初始化关系以及执行顺序(下)
- IOS 怎样有效减少ipa的大小
- IIS6.0日志文件分析代码_1生成访问字段记录到数组中
- oracle 怎样查询含blob字段的表所占空间的大小
- javascript生成/解析dom的CDATA类型的字段的代码
- java基础-显示代码,构造代码块 , 构造函数的初始化顺序
- c#代码怎样制作生成PDF文档
- Java中的构造函数与字段初始化顺序
- 静态构造函数可以确定静态字段的初始化顺序
- 构造函数 ;构造函数的执行顺序。静态字段的初始化顺序。new关键字为我们做了什么。
- 怎样使用powerdesigner类图生成代码及反向