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

  类的构造函数执行顺序简介: 执行派生类某构造函数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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值