IL -- 手动处理装箱Box

系统 1505 0
我们假设静态类DataHelper类有一个静态方法:
public static object GetSafeDbValue( object val)
{
if (val != null )
{
return val;
}

return DBNull .Value;
}
GetSafeDbValue用于在为DbParameter赋值前,检查要赋的值是否为null,如果是,则使用 DBNull .Value替换。
ok,如果我在IL中这样来调用GetSafeDbValue:
ldc.i4.s 12
call
object [DataRabbit]DataRabbit.DataHelper::GetSafeDbValue( object )

则在运行时会抛出异常而导致应用程序退出,原因在于GetSafeDbValue接收的是一个引用类型的参数,而常数 12 是值类型的,所以必须先装箱:

ldc.i4.s 12
box int32
call
object [DataRabbit]DataRabbit.DataHelper::GetSafeDbValue( object )

像上面这种情况稍加留心就可以注意到,但是在为一个object类型的属性赋值时,就不是那么明显了,这个时候仍然需要先通过box装箱值类型后,再赋值给属性,如:
// 获取要赋值的IDataParameter,然后
callvaluetype[mscorlib]System.DateTime[mscorlib]System.DateTime::get_Now()
box[mscorlib]System.DateTime
callvirtinstance
void [System.Data]System.Data.IDataParameter::set_Value( object )









IL -- 手动处理装箱Box


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论