装箱/拆箱和类型转换的区别是什么?
通常,这些术语似乎可以互换使用。
装箱和取消装箱是类型强制转换的子集。装箱是将值类型视为引用类型的行为(在实践中,涉及将该值类型的内容(从堆栈)复制到堆中并返回对该对象的引用)。这允许在需要兼容引用类型的任何地方传递值类型。它还允许对值类型执行虚方法调用和引用类型的其他特性。取消装箱是此操作的相反方向(从装箱对象中取回值类型)。
类型强制转换是用于 任何类型从特定类型的变量转换为另一种类型的术语。这是一个更广泛的概念。
总而言之,我将 C # cast 操作符生成的不同类型的 IL 指令归类为:
box
unbox
dynamic_cast<Type>
castclass
static_cast<Type>
op_XXX
装箱是将值类型(int、 double、 float、 Guid 等)转换为引用类型(System)的术语。目标、系统。字符串等)。执行此装箱操作将分配堆上的内存(垃圾收集器最终将需要回收这些内存)。取消装箱是这个过程的相反方向,接受引用类型并将其转换为值类型。
强制转换是将一个类型(比如 System.Object)视为另一个类型(比如 System.String)。
当你在 C # 中装箱的时候,你是在将它强制转换成另一种类型。
底线: 装箱是一种特殊的强制转换,它将值类型转换为引用类型,这需要分配新的引用类型。
装箱/取消装箱和类型转换是两种不同的操作,但它们使用相同的语法。
只有当谈论它的人不知道真正发生了什么的时候,它们才可以互换使用。
装箱是将值类型作为对象存储在堆上,而解箱是从对象读取值。只能按照值的确切类型解除装箱。
强制转换是指将一个基本类型转换为另一个基本类型(如从 int转换为 long) ,或者更改引用的类型(如从 List<int>转换为 IEnumerable<int>)。
int
long
List<int>
IEnumerable<int>
装箱指的是将非空值类型转换为引用类型或将值类型转换为它实现的某个接口(比如从 int到 IComparable<int>)。此外,将基础值类型转换为可空类型也是装箱转换。(注意: 大多数关于这个主题的讨论会忽略后两种类型的转换。)
IComparable<int>
比如说,
int i = 5; object o = i;
将 i转换为 object类型的实例。
i
object
取消装箱指的是从 object或 ValueType的实例到非空值类型的显式转换,即接口类型到非空值类型的转换(例如,IComparable<int>到 int)。此外,可空类型到基础类型的转换也是拆箱转换。(注意: 大多数关于这个主题的讨论将忽略后两种类型的转换。)
ValueType
object o = (int)5; int i = (int)o;
将 o中装箱的整数转换为 int类型的实例。
o
类型强制转换是表达式到给定类型的显式转换
(type) expression
显式地将 expression转换为 type类型的对象。
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
这样做的好处是统一了类型系统,允许将值类型视为引用类型。这篇文章对装箱/拆箱有更深入的了解。
拳击(隐含)
Int 数 = 12; 对象框 = 数字;
拆箱(显式)
对象框 = 12; Int number = (int) box;