【问题标题】:What is the difference between Converting and Unboxing?转换和拆箱有什么区别?
【发布时间】:2010-11-01 13:40:08
【问题描述】:

在 DLR 的 LINQ 表达式中,这有什么区别:

Expression.Convert(SomeVariableExpression, typeof(T));

还有这个:

Expression.Unbox(SomeVariableExpression, typeof(T));

这方面的文档似乎有点粗略。

更重要的是,其中哪一个相当于这个 C# 代码:

(ClassA)InstanceOfClassB

ClassB 有一个隐式或显式运算符可以转换为 ClassA?

【问题讨论】:

  • 对不起,这被重复发布了。我已经删除了另一个。 :-)
  • 请参阅 this question 了解何时需要使用 Unbox 而不是 Convert 的具体示例。

标签: .net linq .net-3.5 expression-trees dynamic-language-runtime


【解决方案1】:

Unbox 重要的是它为您提供了装箱值的地址。这确保您可以对未装箱的值调用方法。如果该方法改变了值类型,那么它改变的是盒装版本而不是新副本。如果您只是进行了转换,那么您实际上已经制作了盒装值类型的副本,然后在其上调用方法会改变副本而不是原始值。

【讨论】:

    【解决方案2】:

    主要区别在于Epression.Unbox 仅用于从堆中显式拆箱值类型。 Expression.Convert 是您想用来挂钩到用户定义的转换(无论是隐式还是显式)的方法。

    Expression.Convert:

    如果 expression.Type 或 type 是 一个用户定义的类型,它定义了一个 隐式或显式转换 运算符,MethodInfo 表示该运算符是 实现方法。

    还有:

    如果 expression.Type 或 type 是 引用类型和显式装箱, 拆箱或参考转换 从 expression.Type 到 type 存在, 实现方法是 空。

    【讨论】:

      【解决方案3】:

      一般来说,装箱接受一个值类型并将其包装在一个对象中。拆箱则相反。您可以将其视为装箱获取寄存器或堆栈值并将其放在堆上,返回指向该值的指针。拆箱将堆上的对象放入寄存器或堆栈帧中。底层数据类型保持不变。

      将一种数据类型转换为另一种数据类型。

      【讨论】:

        【解决方案4】:

        Expression.Convert 相当于进行强制转换。

        【讨论】:

        • 拆箱是获取先前已装箱的值类型的过程(换句话说,堆栈中的值被复制到堆中,并且对新对象的引用被压入堆栈)。
        猜你喜欢
        • 2023-04-06
        • 1970-01-01
        • 2014-08-02
        • 2011-03-30
        • 2012-02-10
        • 2021-05-28
        • 2010-12-09
        • 2019-07-11
        • 2020-04-16
        相关资源
        最近更新 更多