装箱/拆箱和类型转换的区别是什么?

装箱/拆箱和类型转换的区别是什么?

通常,这些术语似乎可以互换使用。

50953 次浏览

装箱和取消装箱是类型强制转换的子集。装箱是将值类型视为引用类型的行为(在实践中,涉及将该值类型的内容(从堆栈)复制到堆中并返回对该对象的引用)。这允许在需要兼容引用类型的任何地方传递值类型。它还允许对值类型执行虚方法调用和引用类型的其他特性。取消装箱是此操作的相反方向(从装箱对象中取回值类型)。

类型强制转换是用于 任何类型从特定类型的变量转换为另一种类型的术语。这是一个更广泛的概念。

总而言之,我将 C # cast 操作符生成的不同类型的 IL 指令归类为:

  1. 装箱(box IL 指令)和拆箱(unbox IL 指令)
  2. 通过继承层次结构进行转换(如 C + + 中的 dynamic_cast<Type>,使用 castclassIL 指令进行验证)
  3. 在基本类型之间进行强制转换(就像 C + + 中的 static_cast<Type>一样,对于不同类型的基本类型之间的强制转换,有大量的 IL 指令)
  4. 调用用户定义的转换运算符(在 IL 级别,它们只是对适当的 op_XXX方法的方法调用)。

装箱是将值类型(int、 double、 float、 Guid 等)转换为引用类型(System)的术语。目标、系统。字符串等)。执行此装箱操作将分配堆上的内存(垃圾收集器最终将需要回收这些内存)。取消装箱是这个过程的相反方向,接受引用类型并将其转换为值类型。

强制转换是将一个类型(比如 System.Object)视为另一个类型(比如 System.String)。

当你在 C # 中装箱的时候,你是在将它强制转换成另一种类型。

底线: 装箱是一种特殊的强制转换,它将值类型转换为引用类型,这需要分配新的引用类型。

装箱/取消装箱和类型转换是两种不同的操作,但它们使用相同的语法。

只有当谈论它的人不知道真正发生了什么的时候,它们才可以互换使用。

装箱是将值类型作为对象存储在堆上,而解箱是从对象读取值。只能按照值的确切类型解除装箱。

强制转换是指将一个基本类型转换为另一个基本类型(如从 int转换为 long) ,或者更改引用的类型(如从 List<int>转换为 IEnumerable<int>)。

装箱指的是将非空值类型转换为引用类型或将值类型转换为它实现的某个接口(比如从 intIComparable<int>)。此外,将基础值类型转换为可空类型也是装箱转换。(注意: 大多数关于这个主题的讨论会忽略后两种类型的转换。)

比如说,

int i = 5;
object o = i;

i转换为 object类型的实例。

取消装箱指的是从 objectValueType的实例到非空值类型的显式转换,即接口类型到非空值类型的转换(例如,IComparable<int>int)。此外,可空类型到基础类型的转换也是拆箱转换。(注意: 大多数关于这个主题的讨论将忽略后两种类型的转换。)

比如说,

object o = (int)5;
int i = (int)o;

o中装箱的整数转换为 int类型的实例。

类型强制转换是表达式到给定类型的显式转换

(type) expression

显式地将 expression转换为 type类型的对象。

装箱意味着将值类型变量(即整数)转换为引用类型。取消装箱是相反的,使用类型强制转换。在。NET 世界中,所有东西都是从“对象”类型派生出来的。

例如(C # 示例) :

int myInt = 0;                 // original variable (unboxed to begin with)
object boxed = myInt;          // box it up
int myIntUnBoxed = (int)boxed; // and unbox it again using type casting

这样做的好处是统一了类型系统,允许将值类型视为引用类型。这篇文章对装箱/拆箱有更深入的了解。

拳击(隐含)

  • < strong > Value type 转换为 < strong > 参考类型 的过程
  • 或转换为由值类型实现的任何接口类型。
  • 当 CLR 对值类型进行装箱时,它将该值包装在 System 中。反对。实例并将其存储在托管堆上
  • 例子
    Int 数 = 12;
    对象框 = 数字;

拆箱(显式)

  • < strong > 参考类型 转换为 < strong > Value type 的过程
  • 或者从任何接口类型转换为实现接口类型的任何值类型
  • 在这个场景中,类型强制转换 要求。
  • 例子
    对象框 = 12;
    Int number = (int) box;