当前位置: 首页 > news >正文

深入理解C#中的装箱与拆箱操作及其性能影响

在C#中,装箱(Boxing)和拆箱(Unboxing)是两种与值类型(如int、struct等)和引用类型(如class)之间的转换相关的操作。这两种操作主要涉及到在堆(Heap)和栈(Stack)之间移动数据。

装箱(Boxing)

装箱是将值类型转换为引用类型(特别是System.Object类型或任何值类型实现的接口类型)的过程。这个转换涉及到在堆上分配内存以存储值类型的值,并将这个值的副本放入新分配的内存中。然后,返回一个指向这块内存的引用(即object类型的引用),这个引用指向堆上的数据。

这个过程之所以被称为“装箱”,是因为值类型原本被“装”在栈上(或者是在方法调用中的临时存储区域),而现在被“装箱”到了堆上。

int i = 10;
object obj = i; // 装箱操作

拆箱(Unboxing)

拆箱是装箱的逆过程,即将引用类型(特别是System.Object类型或任何值类型实现的接口类型)转换回值类型的过程。这个操作涉及到检查引用所指向的对象是否确实包含了一个特定值类型的值,并将这个值从堆上复制回栈(或者到另一个适当的存储位置)。

这个过程之所以被称为“拆箱”,是因为它涉及到从堆上“拆”出值,并将其转换回原始的值类型。

object obj = 10; // 隐式装箱
int i = (int)obj; // 显式拆箱

注意事项

  • 装箱和拆箱操作通常会有性能开销,因为它们涉及到在堆和栈之间移动数据,并可能涉及内存分配和类型转换检查。
  • 拆箱操作如果失败(例如,尝试将一个不包含特定值类型值的对象拆箱),将引发InvalidCastException异常。
  • 装箱操作是不可逆的,因为一旦值类型被装箱为引用类型,原始的值类型值将不再直接可用。只能通过拆箱操作来获取一个副本。
  • 拆箱操作仅适用于引用类型指向的对象实际上包含了一个值类型的值的情况。如果引用类型指向的是其他类型的对象(如另一个类的实例),尝试进行拆箱将会失败。

http://www.mrgr.cn/news/37273.html

相关文章:

  • 力扣经典笔试题 最小K个数 小根堆 大根堆 快速排序 一题多解
  • 硬件设计很简单?合宙低功耗4G模组Air780E—开机启动及外围电路设计
  • 代码随想录算法训练营第四四天| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列
  • 大学生科技竞赛系统小程序的设计
  • Day 2 词汇备战
  • MySQL_插入、更新和删除数据
  • 【Python报错已解决】TypeError: list indices must be integers or slices, not str
  • [网络]数据链路层-MAC帧与ARP协议
  • java日志门面之JCL和SLF4J
  • ICM20948 DMP代码详解(46)
  • 个人文章汇总(MyBatis)
  • 解决 Adobe 盗版弹窗
  • Linux在桌面和服务器领域的最新技术趋势,包括3D桌面、虚拟技术、安全性提升等维度。
  • 11 函数的定义和使用
  • FastAPI 第五课 -- 基本路由
  • 显示技术概念极简理解(分辨率、英寸、PPI、DPI)
  • 2:数据结构:列表与元组
  • sicp每日一题[2.30]
  • Java中的注解处理器:自定义注解与APT工具的应用场景
  • YOLOv8默认使用的优化器是什么?optimizer默认值auto指定的是什么优化器?