装箱和拆箱是值类型和引用类型之间相互转换是要执行的操作。 

1. 装箱在值类型向引用类型转换时发生

2. 拆箱在引用类型向值类型转换时发生

光上述两句话不难理解,但是往深处了解,就需要一些篇幅来解释了。

我们先看装箱时都会发生什么事情,下面是一行最简单的装箱代码

object obj = 1;

这行语句将整型常量1赋给object类型的变量obj; 众所周知常量1是值类型,值类型是要放在栈上的,而object是引用类型,它需要放在堆上;要把值类型放在堆上就需要执行一次装箱操作。

这行语句的IL代码如下,请注意注释部分说明:

.locals init ([0] object objValue
)  //以上三行IL表示声明object类型的名称为objValue的局部变量
IL_0000: nop
IL_0001: ldc.i4.s 9 //表示将整型数9放到栈顶
IL_0003: box [mscorlib]System.Int32 //执行IL box指令,在内存堆中申请System.Int32类型需要的堆空间
IL_0008: stloc.0 //弹出堆栈上的变量,将它存储到索引为0的局部变量中

以上就是装箱所要执行的操作了,执行装箱操作时不可避免的要在堆上申请内存空间,并将堆栈上的值类型数据复制到申请的堆内存空间上,这肯定是要消耗内存和cpu资源的。我们再看下拆箱操作是怎么回事:

请看下面的C#代码:

object objValue = 4;
int value = (int)objValue;

上面的两行代码会执行一次装箱操作将整形数字常量4装箱成引用类型object变量objValue;然后又执行一次拆箱操作,将存储到堆上的引用变量objValue存储到局部整形值类型变量value中。

同样我们需要看下IL代码:

.locals init ([0] object objValue,[1] int32 'value'
) //上面IL声明两个局部变量object类型的objValue和int32类型的value变量
IL_0000: nop
IL_0001: ldc.i4.4 //将整型数字4压入栈
IL_0002: box [mscorlib]System.Int32  //执行IL box指令,在内存堆中申请System.Int32类型需要的堆空间
IL_0007: stloc.0 //弹出堆栈上的变量,将它存储到索引为0的局部变量中
IL_0008: ldloc.0//将索引为0的局部变量(即objValue变量)压入栈
IL_0009: unbox.any [mscorlib]System.Int32 //执行IL 拆箱指令unbox.any 将引用类型object转换成System.Int32类型
IL_000e: stloc.1 //将栈上的数据存储到索引为1的局部变量即value

拆箱操作的执行过程和装箱操作过程正好相反,是将存储在堆上的引用类型值转换为值类型并给值类型变量。

装箱操作和拆箱操作是要额外耗费cpu和内存资源的,所以在c# 2.0之后引入了泛型来减少装箱操作和拆箱操作消耗。

下一篇我们看下使用泛型和不使用泛型情况下的装箱拆箱情况。

转载于:https://www.cnblogs.com/yukaizhao/archive/2011/10/18/csharp_box_unbox_1.html

深入理解C#的装箱和拆箱相关推荐

  1. 理解C#中装箱和拆箱的概念

    前言 C#数据类型 什么是装箱.拆箱 产生装箱.拆箱的举例 总结 前言 C# 是一种通用.面向对象的编程语言,由微软(Microsoft)开发的,属于强类型语言,变量需先声明数据类型.然后给变量赋初值 ...

  2. 一文带你理解Java中自动装箱和拆箱

    Java中自动装箱和拆箱 装箱(Boxing),也称为包装(Wrapper),是在对象中放置原语类型(primitive type)的过程,以便原语(primitive)可以作为引用对象使用. 这里的 ...

  3. java byte 判断相等_深入理解Java装箱与拆箱

    写给小白看的Java基础知识,阅读本文大概需要7分钟 Java中有8种基础数据类型,boolean,char,byte,short,int,long,float,double.从jdk5开始提供了自动 ...

  4. C#基础:理解装箱与拆箱

    .NET大牛之路 • 王亮@精致码农 • 2021.08.27 前面我们讲到 .NET 平台支持的两大数据类型:值类型和引用类型.值类型比引用类型更高效,因为它没有指针引用,不用分配在托管堆中,也不用 ...

  5. [019] C#基础:理解装箱与拆箱

    .NET大牛之路 • 王亮@精致码农 • 2021.08.27 前面我们讲到 .NET 平台支持的两大数据类型:值类型和引用类型.值类型比引用类型更高效,因为它没有指针引用,不用分配在托管堆中,也不用 ...

  6. 如何理解Java中的自动拆箱和自动装箱?

    小伟刚毕业时面的第一家公司就被面试官给问住了,记忆尤深啊- 如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这-这-知识盲区- 回到家后小伟赶紧查资料,我透,这不就 ...

  7. 如何理解Java自动装箱_如何理解Java中的自动拆箱和自动装箱?

    如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这...这..知识盲区... 回到家后小伟赶紧查资料,我透,这不就是问基本类型跟封装类型吗,面试官整啥名词呢... ...

  8. java中的拆箱和装箱是指什么_一文带你理解Java中自动装箱和拆箱

    Java中自动装箱和拆箱 装箱(Boxing),也称为包装(Wrapper),是在对象中放置原语类型(primitive type)的过程,以便原语(primitive)可以作为引用对象使用. 这里的 ...

  9. 对C#装箱和拆箱的理解

    [什么是装箱和拆箱] 装箱(box)是将值类型转换为引用类型的过程,拆箱(unbox)是将引用类型转换为值类型的过程 [装箱过程] 先在堆上分配存储位置.(注解:引用类型的数据值放在堆中) 将值类型数 ...

最新文章

  1. OpenCV+python:ROI与泛洪填充
  2. hid自定义report 影响键盘_【iOS12人机交互指南】10.1-自定义键盘
  3. SAP MM 事务代码MRKO触发的财务凭证不会出现在PO History里
  4. POJ - 2778 DNA Sequence(AC自动机+矩阵快速幂)
  5. Valid Number
  6. 100 万在中国不同地方能活多久?
  7. 百度地图离线sdk java_百度地图SDK java.lang.UnsatisfiedLinkError: Couldn't load BaiduMapSDK...
  8. Unity 3D中 Ulua-UGUI简单的Demo——热更新的具体流程、使用说明
  9. tensorflow.python.framework.tensor_shape.is_fully_defined()
  10. 系统架构设计理论与原则、负载均衡及高可用系统设计速记
  11. 阿里李飞飞:云原生分布式数据库面临哪些机遇与挑战?
  12. 东北大学计算机学院宿舍环境,软件学院二舍A区308寝室
  13. [HNOI2004]宠物收养所
  14. 201809-4 再卖菜(100分)
  15. 刷脸支付就是会员为大商户管理与运营提供帮助
  16. L2-039 清点代码库(Python3)
  17. C++产生随机数的几种方法
  18. 小技巧——如何为foxmail中的文字编辑超链接
  19. 5G智能网联路侧设备覆盖率提升探索
  20. oppo A8刷root OPPO A9 root安装面具magisk,TWRP下载PDBM00救砖教程PCAM10

热门文章

  1. java8中class怎么用_Java8中你可能不知道的一些地方之方法引用实战
  2. 查一个字段中字符集超过30的列_Mysql 的字符集以及带来的一点存储影响
  3. 如何在Javascript中创建范围
  4. 第三个维度:z-index
  5. python调用r语言加载包错误_Python中调用R语言包指南.docx
  6. 无线扩展器怎么连接好友服务器失败怎么办,tplink无线扩展器怎么设置 tplink无线扩展器设置方法...
  7. 计算机文字录入教案,《文字录入》(1-4)教案.doc
  8. java 用ajax更新表单,ajax刷新表格,该如何处理
  9. qjsonarray 合并_QJsonObject和QJsonArray的巨坑
  10. 20200703:将有序数组转换为二叉搜索树(leetcode108)