转换和拆箱有什么区别?

时间:2009-06-09 17:31:07

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

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

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

和此:

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

关于此的文档似乎有点粗略。

更重要的是,其中一个等同于这个C#代码:

(ClassA)InstanceOfClassB

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

主要区别在于Epression.Unbox只需要从堆中显式取消装箱值类型。 Expression.Convert是您希望用于挂钩到用户定义的转换(无论是隐式还是显式)的方法。

请参阅Expression.Convert

  

如果是expression.Type或type,则为   用户定义的类型,用于定义   隐式或显式转换   运算符,MethodInfo那个   表示运算符是   实施方法。

还有:

  

如果expression.Type或type是a   引用类型和明确的拳击,   取消装箱或参考转换   从expression.Type到type,   实施方法是   空。

答案 2 :(得分:2)

通常,boxing会获取值类型并将其包装在对象中。拆箱反之亦然。您可以将此视为拳击占用寄存器或堆栈值并将其放在堆上,返回指向该值的指针。取消装箱会在堆上获取一个对象并将其放入寄存器或堆栈帧中。基础数据类型保持不变。

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

答案 3 :(得分:1)

Expression.Convert相当于做一个演员。