黑马程序员技术交流社区

标题: 装箱与拆箱 [打印本页]

作者: 迷你卡卡    时间: 2013-10-23 19:30
标题: 装箱与拆箱
本帖最后由 迷你卡卡 于 2013-10-24 15:09 编辑

装箱就是将值类型转换为引用类型,拆箱就是将引用类型转换为值类型,
int mon=10;
string str=Convert.ToString(mon);
int sun=int.Parse(str);
求高手解答,第二句代码发生装箱了吗?第三句代码发生拆箱了吗?
还有就是拆箱与装箱对于程序的整体性能是不是有比较大的损耗呢?

作者: 面朝大海,春暖    时间: 2013-10-23 20:04
都没有发生装箱拆箱,
先看看如何定义:
装箱是将值类型转换为引用类型 ;
拆箱是将引用类型转换为值类型
例子:
int i=100;
object obj=i;//装箱
int o=(int)obj;//拆箱

作者: ˋ初°见    时间: 2013-10-23 20:23
装箱是将值类型转换为引用类型 ,拆箱是将引用类型转换为值类型 ,如果叫不准时建议用反编译器(Reflector)来查看
  1. int mon=10;
  2. string str=Convert.ToString(mon);
  3. int sun=int.Parse(str);
复制代码
都没有发生装箱和拆箱,我用反编译器看的,没有显示box或unbox

1.png (28.38 KB, 下载次数: 39)

1.png

作者: 姐的霸气谁懂    时间: 2013-10-23 21:15
都没有进行装箱和拆箱,
     装箱是将值类型转换为引用类型 ;
     而拆箱,实质上就是将引用类型转换为值类型的过程,拆箱的执行过程大致可以分为以下两个阶段。
(1)检查对象的实例,看它是不是值类型的装箱值。
(2)把这个实例的值复制给值类型的变量

总结:
装箱是将值类型转换为引用类型Object,这使得值类型可以存储在垃圾回收堆中,而拆箱是从对象中提取值类型。
相对于简单的赋值而言,装箱和拆箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个全新的对象;而拆箱所需的强制转换也需要进行大量的计算,因此装箱和拆箱会对程序的执行性能有影响。
作者: ィSlick    时间: 2013-10-23 21:32
没有实现拆装箱
Convert.ToString(mon);把 int 的每一位根据 ASSIC 表得出 char 值,再把所有 char 组合在一起成 string ,这个起码参数传递时没拆装箱,底层的转换函数应该是 native 的,也没装拆的说法
作者: 迷你卡卡    时间: 2013-10-24 15:09
多谢各位的耐心解答
作者: 有你珍贵    时间: 2013-10-24 19:30
int 和string 类型都是值类型。所以不存在。
拆箱是  引用类型转换为值类型。
装箱是 值类型转换为引用类型。
不管是发生装箱还是拆箱,必须要复合一个条件:发生拆箱或者装箱的两种类型必须有继承关系。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2