Welcome

首页 / 软件开发 / C# / 《Effective C#》之减少装箱和拆箱

《Effective C#》之减少装箱和拆箱2010-12-13 天极 愚翁为了便于文章的开展,首先介绍装箱(Boxing)和拆箱(Unboxing)这两个名词 。.Net的类型分为两种,一种是值类型,另一种是引用类型。这两个类型的本质 区别,值类型数据是分配在栈中,而引用类型数据分配在堆上。那么如果要把一 个值类型数据放到堆上,就需要装箱操作;反之,把一个放在堆上的值类型数据 取出来,则需要进行拆箱操作。

例如,对于如下简单的装箱和拆箱操作 语句。

int i = 123;
object obj = i;//Boxing
if( obj is int )
int j = (int) obj;//Unboxing

为了,更好的诠释装箱和拆箱操作,我借用MSDN 关于“Boxing”的解释图,具体如下。

明白了这两名词的意思,现在说说为什么要减少装箱和拆箱操作。

原因 有两个,主要是关于效率:一个就是对于堆的操作效率比较低;另一个就是对于 堆上分配的内存资源,需要GC来回收,从而降低程序效率。

考虑到这两 点因素,那么需要在程序中减少装箱和拆箱操作。

如何减少呢,涉及到 这两个操作比较多的是,格式化输出操作,例如:String.Format, Console.WriteLine之类的语句。

例如:

Console.WriteLine( "Number list:{0}, {1}, {2} ",1,2,3 );

对于“1,2,3”来说,相当于前面 的“123”一样,需要经过装箱和拆箱两个操作。那么如何避免呢, 其实只要向WriteLine传递引用类型数据即可,也就是按照如下的方式。

Console.WriteLine( "Number list:{0}, {1}, {2} ", 1.ToString(),2.ToString(),3.ToString() );

由于 “1.ToString()”的结果是String类型,属于引用类型,因此不牵扯 装箱和拆箱操作。

其次,牵扯到装箱和拆箱操作比较多的就是在集合中 ,例如:ArrayList或者HashTable之类。