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)








        
  • 相关阅读:
    VC窗口类的销毁-是否需要delete
    ScrollView在调试状态一点击就挂的原因(OnMouseActivate)
    TextOut与DrawText的区别
    NOIP2010 引水入城
    欧拉回路
    BZOJ 1202: [HNOI2005]狡猾的商人
    codevs 2491 玉蟾宫
    BZOJ 1059: [ZJOI2007]矩阵游戏
    BZOJ 1024: [SCOI2009]生日快乐
    ural 1297. Palindrome
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/1183449.html
Copyright © 2011-2022 走看看