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
将一个值类型变量赋值给一个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
相关文章推荐
- Learn asp.net(C#) Base 0.1接触堆栈
- Learn asp.net(C#) Base 编程需要了解的
- Learn asp.net(C#) Base 索引
- C#.NET学习笔记---C#中的装箱和拆箱
- 黑马程序员——C#枚举 结构体 this关键字 base关键字 值类型 引用类型 装箱和拆箱
- Teddy's Knowledge Base--基于.Net 2.0 (C# 2.0, ASP.NET 2.0)的快速开发框架设计NBear V2.0.0 [开源]
- csharp:Learn how to post JSON string to generic Handler using jQuery in ASP.Net C#.
- 分享一大堆最新dot net asp.net c# 电子书下载 , 英文原版的。经典中的经典
- 基于Asp.net C#实现HTML转图片(网页快照)
- 【转】C# 装箱和拆箱[整理]
- C#(asp.net)对字符串的操作公共类(StringUtil.cs)
- ASP.NET 2.0(C#)中使用webpart系列控件(4)
- C# asp.net常见编译|运行错误
- Asp.net(C#)给图片加上水印效果〔zz〕
- asp.net(c#) static关键字用法小结[zz]
- C#ASP.NET+FMS+JS实现视频聊天
- asp.net/c# 发送邮件
- ASP.NET(C#) Web Api通过文件流下载文件到本地实例
- 【转】Asp.net(C#)对文件操作的方法(读取,删除,批量拷贝,删除...)
- C#(ASP.NET)DateTime日期类型格式化显示