zoukankan      html  css  js  c++  java
  • IL 手动处理装箱Box

        我们假设静态类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)








        
  • 相关阅读:
    luogu 2617
    BZOJ 3295
    BZOJ 2458
    luogu 3810
    Uva
    Uva
    Uva
    Uva
    Uva
    成员函数的const到底修饰的是谁
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/1183449.html
Copyright © 2011-2022 走看看