您的位置:首页 > 编程语言 > ASP

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

2010-05-14 15:00 507 查看
相信大家都了解装箱和拆箱的概念。这里也只是说说它们的概念,同时说下它们对性能的潜在影响。

将一个值类型变量赋值给一个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: