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

C#装箱与拆箱详解

装箱和拆箱是C#语言中非常重要的两个概念。在C#中,值类型(如int,double,struct等)和引用类型(如class,interface等)是两种完全不同的数据类型。而装箱和拆箱就是这两种类型之间转换的过程。

在C#中,所有的值类型都直接派生自System.ValueType,而System.ValueType又派生自System.Object。这意味着值类型在某种程度上也是对象类型,因此可以访问一些普通对象的方法,如ToStringEqualsGetHashCode等。装箱和拆箱就是C#为了在值类型和引用类型之间建立桥梁而提供的机制。

装箱

当我们将一个值类型转换为object类型或者任何此值类型的接口类型时,就发生了装箱操作。装箱操作涉及到堆内存分配,这是一个相对昂贵的操作。这是因为它需要创建一个新的对象,然后将值类型的值复制到这个新对象。由于装箱操作涉及到内存分配,所以在性能敏感的代码中,我们应尽量避免装箱操作。

int i = 123;  // 创建值类型变量
object o = i; // 装箱操作

拆箱

拆箱是装箱的反向操作,即将一个引用类型转换为值类型。拆箱操作同样也需要进行内存分配。拆箱操作需要类型完全匹配,否则会在运行时抛出InvalidCastException异常。

object o = 123;  // 装箱操作
int i = (int)o;  // 拆箱操作

一个重要的点是,拆箱操作是在已装箱的对象上执行的。如果你试图拆箱一个没有被装箱的对象,你将会得到一个InvalidCastException异常。

性能影响

由于装箱和拆箱都涉及到堆内存操作,所以它们都是有性能开销的。在大量进行装箱和拆箱操作的情况下,这种性能开销可能会变得很明显。因此,在编写代码时,我们应该尽量避免不必要的装箱和拆箱操作。

例如,使用泛型集合(如List)而不是非泛型集合(如ArrayList)可以避免装箱和拆箱操作,因为泛型集合在编译时就已经确定了类型,而非泛型集合在存储值类型时需要进行装箱操作。

总的来说,了解装箱和拆箱以及它们的性能影响,可以帮助我们写出更高效的C#代码。


http://www.kler.cn/a/133324.html

相关文章:

  • UNIX网络编程-TCP套接字编程(实战)
  • leetcode hot100【LeetCode 236.二叉树的最近公共祖先】java实现
  • 入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法:科技守护安全的新篇章
  • Spark RDD中常用聚合算子源码层面的对比分析
  • 入侵排查之Linux
  • Flutter 小技巧之 OverlayPortal 实现自限性和可共享的页面图层
  • 实验三 页面置换算法
  • 数据结构【DS】树和森林的遍历对应关系
  • Linux(4):Linux文件与目录管理
  • 个人微信机器人接口
  • .Net Web项目创建比较不错的参考文章
  • 汇丰银行:在数字化银行的探索与实践
  • 数智竞技何以成为“科技+体育”新样本?
  • Mysql相关操作命令合集
  • SQL SERVER 2008安装教程
  • leetcode415拓展字符串相加(带符号)
  • 音视频项目—基于FFmpeg和SDL的音视频播放器解析(十)
  • vite+react+typescript 遇到的问题
  • 远程创建分支本地VScode看不到分支
  • stm32 HSUSB
  • vscode运行dlv报错超时
  • 用5000字讲清楚压敏电阻
  • 基础模型的自然语言处理能力综述
  • Linux tc 使用
  • 李沐的学习Pytorch环境配置
  • 【数据结构】希尔排序(最小增量排序)