# 定义
装箱是将值类型转换为 object 类型或由此值类型实现的任何接口类型的过程
拆箱取消装箱将从对象中提取值类型
装箱是隐式的;取消装箱是显式的
# 装箱与拆箱内部过程
  • 装箱
    • 从托管堆中分配新创建的对象的内存 (值类型实际的大小 + 方法表指针 + SyncBlockIndex)
    • 将值类型的值拷贝分配到的内存中
    • 返回托管堆的新分配对象的地址
  • 拆箱
    • 首先获取托管堆中属于值类型那部分字段的地址,这一步是严格意义上的拆箱
    • 将引用对象中的值拷贝到位于线程堆栈上的值类型实例中
# 官方文档描述
数据类型被分隔为值类型和引用类型。 值类型要么是堆栈分配,要么在结构中以内联方式分配。 引用类型为堆分配。 引用类型和值类型均派生自最终基类 Object 。 如果需要值类型的行为与对象类似,则会在堆上分配值类型类似于引用对象的包装,并将值类型的值复制到其中。 包装已标记,因此系统知道它包含值类型。 此过程称为装箱,相反的过程称为取消装箱。 装箱和取消装箱允许任何类型被视为对象
# 使用场景
  • 调用一个含类型为 Object 的参数的方法,该 Object 可支持任意为型,以便通用,当你需要将一个值类型 (如 Int32) 传入时,需要装箱
  • 另一种用法是,一个非泛型的容器,同样是为了保证通用,而将元素类型定义为 Object。于是,要将值类型数据加入容器时,需要装箱
更新于