IL -- 手动处理装箱Box

简介: 我们假设静态类DataHelper类有一个静态方法:        public static object GetSafeDbValue(object val)         {             if (val != null)             {       ...
    我们假设静态类 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 )








    
目录
相关文章
|
4月前
|
C++
[C++] 强制类型转换(dynamic_cast和dynamic_Pointer_cast)
[C++] 强制类型转换(dynamic_cast和dynamic_Pointer_cast)
37 1
|
10月前
类和对象,display函数不放在Time类中,而作为类外的普通函数,然后分别在Time 和Date类中将display声明为友元函数。
类和对象,display函数不放在Time类中,而作为类外的普通函数,然后分别在Time 和Date类中将display声明为友元函数。
94 0
(JAVA)错误:Type mismatch: cannot convert from double to float ,这是什么意思?如何解决?
(JAVA)错误:Type mismatch: cannot convert from double to float ,这是什么意思?如何解决?
(JAVA)错误:Type mismatch: cannot convert from double to float ,这是什么意思?如何解决?
|
开发框架 .NET