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)








        
  • 相关阅读:
    java获取服务器的ip和地址
    如何产生好的词向量
    谈谈评价指标中的宏平均和微平均
    在NLP中深度学习模型何时需要树形结构?
    Windows下MetaMap工具安装
    ML 感知机(Perceptrons)
    ML 神经网络 NeuralNetworks
    NLP-特征选择
    ML 逻辑回归 Logistic Regression
    ML 线性回归Linear Regression
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/1183449.html
Copyright © 2011-2022 走看看