• 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)








        
  • 相关阅读:
    数据库纳管平台DBhouse的技术路线与实践
    srand((unsigned)time(NULL))
    vue3源码理解1
    pygame listbox
    搬家啦!
    查找最大的小岛面积
    cve202222965
    Web字体的@fontface规则说明和应用。
    Ngnx try_files的应用
    Web UserAgent的解释和组成规则
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/1183449.html
Copyright © 2020-2023  润新知