装箱和拆箱

.NET中的数据分为引用类型和值类型。

引用类型继承自System.object,值类型继承自System.ValueType.

我们自己定义的类和.NET Framework提供的类,都是属于引用类型。一般的简单类型如int,string和结构体等等都是属于值类型。

引用类型和值类型在内存中所占的位置也是不同的,引用类型分配于托管堆上,而值类型分配于当前线程的堆栈空间上。

装箱的过程就是将值类型变为引用类型的过程。整个过程大体是:申请托管堆空间--复制值类型的变量值到托管堆空间中--在当前线程堆栈空间分配一个指针指向该托管堆空间。一个值类型就通过这几步被封装为一个引用类型了。

拆箱的过程与之基本相反。即把引用类型的值从托管堆复制出新申请的堆栈空间单元中,删除指向托管堆的指针。

什么情况下发生装箱和拆箱呢?

例如,.NET中所有类的最上层基类都是System.Object,System.ValueType也不例外,System.Object中有很多公共的方法,如ToString(),Equal()等,继承自System.ValueType的值类型在调用这些方法时,就必须要经历一个装箱的过程,如:

int nType=2;

Console.Writeline(nType.ToString());   // "2"

一个拆箱的例子:

int nType = 2;

object objTemp = (Object)nType;  // 装箱

int nCopyType = (int)objTemp;      // 拆箱

装箱拆箱过程所带来的运行效率的降低可想而知。

在编写代码过程中应尽量避免装箱拆箱的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值