标题: IL -- 手动处理装箱Box
- zhuweisky 2008-05-05 15:23 阅读:1750
- 评论:6 查看评论 | 添加评论
    我们假设静态类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,然后
call valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
box [mscorlib]System.DateTime
callvirt instance void [System.Data]System.Data.IDataParameter::set_Value(object)








    

查看评论 | 添加评论
返回顶部 | 返回首页