A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵威 中级黑马   /  2013-5-5 10:53  /  1966 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

string str="123";
int x=Convert.ToInt32(str);

int x=122;
string str=x.ToString();
以上两段代码算是装箱和拆箱么?为什么??

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

8 个回复

倒序浏览
同上,下面的是装箱和拆箱  上面的不清楚,求解.
回复 使用道具 举报
装箱是将内容赋值给object对象,拆箱是将object中的内容拿出来强制转换成原来的内容。
这里有篇文章是自己以前写的拆箱和装箱,你可以参考一下。:)
回复 使用道具 举报
本帖最后由 曾大鹏 于 2013-5-5 11:28 编辑

装箱: 将值类型转换为引用类型的过程
拆箱:将引用类型转换为值类型的过程

第一个是拆箱
第二个是装箱
回复 使用道具 举报
楼上正解,和面试宝典一模一样
回复 使用道具 举报
装箱和拆箱是属于面向对象的一种表现形式。
string str="123";
int x=Convert.ToInt32(str);
在java中,String并不属于基本数据类型,它是属于类,所以这上面形成了两种操作,把"123"装箱成String
而 int x=Convert.ToInt32(str);语句是完成了拆箱的操作。
int x=122;
string str=x.ToString();
int 本身属于基本数据类型所以它只完成一种操作是把x进行了装箱
回复 使用道具 举报
   二者是不存在装箱和拆箱的,书中说的应该有错误吧。要想看是否装箱和拆箱,最简单的办法就是反汇编看以下IL代码,如果出现了box指令则装箱,如果出现了unbox指令则拆箱。
  你用IL反汇编一下就知道了,下面是大致的IL代码:

可以发现,里面根本没有任何box和unbox指令,因此没有发生装箱和拆箱。如果对此还是持有怀疑,可以继续查看一下Convert.ToInt32(string)方法,你会发现这个方法调用了Int的Parse方法,而在这个Parse方法内也没有出现box和unbox指令。
  现在有必要重温一下装箱和拆箱的概念了,装箱的有两大前提,第一是必须具有派生关系,int派生于ValueType,而ValueType派生于object,所以将int装换为object存在装箱,第二必须是从值类型到引用类型。二者缺一不可。而int和string显然只满足了第二点,但不满足第一点,故不存在派生关系。
  可以想象,从int到IComparable直接肯定存在装箱和拆箱关系,因为int继承了IComparable,而接口又是引用类型。
  

未命名.jpg (65.77 KB, 下载次数: 0)

未命名.jpg
回复 使用道具 举报
装箱的定义是 由值类型转换到引用类型。
而拆箱是相反的过程,由引用类型转换到值类型。
因为值类型都是存储在内存的堆上,而引用类型存储在内存的栈上。
LZ所述第一个过程是从引用类型转换到值类型,根据定义可以看出此过程是拆箱过程。
同理LZ所述第二个过程则是装箱过程。
而且从原理上看装箱操作生成了一个全新的引用对象,对效率有一定影响,所以在时间操作过程中要尽量避免装箱操作。
装箱拆箱操作原理(引自百度百科 拆箱 词条)
装箱
装箱:对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。按三步进行。
第一步:新分配托管堆内存(大小为值类型实例大小加上一个方法表指针和一个SyncBlockIndex)。
第二步:将值类型的实例字段拷贝到新分配的内存中。
第三步:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了。
拆箱
拆箱:检查对象实例,确保它是给定值类型的一个装箱值。将该值从实例复制到值类型变量中。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马