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
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