Learn asp.net(C#) Base 0.2装箱拆箱

相信大家都了解装箱和拆箱的概念。这里也只是说说它们的概念,同时说下它们对性能的潜在影响。

将一个值类型变量赋值给一个object类型变量时,便发生了装箱(boxing)

将一个object类型变量赋值给一个与对象实际类型相同的变量时,便发生了拆箱(unboxing)

 

也许大家常见的说法是指将值类型转换为引用类型即为装箱。反之就是拆箱

不过这样的说法只能说是不严谨,不能说它就是错误的。

 

其实,在装箱与拆箱的过程中还涉及到一个名词——托管堆。它就是像是一个存放类型的容器。

下面就详细的说说这个与性能有关的细节:

例如:

 

1 decimal amountIn=3.05m;
2 
3 object obj=amountIn; //box
4 
5 decimal amountOut=(decimal)obj; //unbox
6 

 

装箱导致一个新对象分配到托管堆上,并且初始值的一个副本被放置到了已装箱的对象中。那么,现在我们就拥有了原始值的两个副本:一个位于值类型中的变量中,另一个位于已装箱的位于托管堆中的object中了。从上边的代码中可以看出obj中,它位于托管堆上。你可以将那个值从已装箱的decimal中拉出来;位于obj中的装箱值被复制到了decimal变量amountOut中。现在你拥有了赋值给amountIn初始值的3个副本。

随软实际引用中上边的代码没有什么意义,但是装箱、拆箱的要点是为了让大家了解发生事情的过程,同时理解与其先关的开销。否则可能大家会编写很多的类似这样的代码,就会给程序运行后带来开销上的问题

这样的例子经常会在ArrayList中。如:

代码
 1 ArrayList prices=new ArrayList();
 2 
 3 decimal amount1=7.05m;
 4 decimal amount2=1.95m;
 5 
 6 prices.Add(amount1);
 7 prices.Add(amount2);
 8 
 9 foreach(decimal amount in prices)
10 {
11     Console.WriteLine("Amount:{0}”,amount);
12 }
13 

 

posted @ 2010-05-14 15:00  pyCoders  阅读(188)  评论(0编辑  收藏  举报