《Effective C#》之减少装箱和拆箱
日期:2007年8月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之类。
把值类型数据放到集合中,可能会出现潜在错误。例如:
public struct Person
{
private string _Name;
public string Name
{
get{ return _Name; }
set{ _Name = value; }
}
public Person( string PersonName )
{
_Name = PersonName;
}
public override string ToString()
{
return _Name;
}
}
// Using the person in a collection
ArrayList arrPersons = new ArrayList();
Person p = new Person( "OldName" );
arrPersons.Add( p );
// Try to change the name
p = ( Person ) arrPersons[0] ;
p.Name = "NewName";
Debug.WriteLine( ( (Person ) arrPersons[0] ).Name );//It's "OldName"
这个问题其实在前面的文章中已经讲过了。有人可能会说,是否可以按照如下的方式去修改呢。
- [1] [2] [3] 下一页
- 《Effective C#》之减少装箱和拆箱 相关文章:
- ·Photoshop字体安装使用方法和技巧
- ·诊断和分析提高搜索引擎网站排名
- ·CSS常见问题和技巧总结
- ·利用UNIX的TFTP和RCP配置路由器
- ·Linux和Windows系统升级的最大不同
- ·路由器性能和指标详解
- ·系统漏洞的形成和防治办法
- ·迅雷实现BT和电骡异地下载
- ·火拼QQ泡泡龙常见问题和解决办法
- ·Static和Final修饰类属性变量及初始化
- 《Effective C#》之减少装箱和拆箱 相关软件
- · 奥拉夫和艾尔玛经典小游戏
- ·NDS《哈利波特和凤凰令》模拟器
- ·GBA《维杰传说:拉里小子和坏苹果》模拟器
- ·《福尔摩斯和失落的文件》角色扮演试玩
- ·NDS《和哈姆太郎一起生活》模拟器
- ·《不和平时期》策略RPG试玩
- ·和珅系列
- ·红色警戒2共和国之辉
- ·猫和老鼠弹珠台 汉化版
- ·高和作品集
下一篇:技巧:无线路由器的安全配置
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
精品推荐
热点TOP10
- ·GIF Animator 5.0轻松动画制作
- ·word和EXCEL文件如何导入问题汇总
- ·笔记本精美桌面壁纸鉴赏——ASUS R1
- ·在家开影楼—轻松制作艺术照
- ·免费绘图软件Paint.NET推出3.2正式版
- ·AutoCAD高版本中布局(layout)的使用
- ·2008年北京奥运会体育图标
- ·Freehand 10 基本操作(5)
- ·Macromedia FreeHand MX 简介与下载
- ·FreeHand 10 新特性(4)
- ·FreeHand MX全新体验三
- ·FreeHand 界面和面板的变化
- ·Freehand 10 基本操作(10):使用「图形喷管」工具绘图
- ·Freehand 10 基本操作(8):重新造形路径
- ·Freehand 10 基本操作(7)
- ·[设计]MACROMEDIA CONTRIBUTE 阶段教学(6)
- ·[设计]MACROMEDIA CONTRIBUTE 阶段教学(4)
- ·[设计]MACROMEDIA CONTRIBUTE 阶段教学(3)
- ·Freehand9.0全程讲解-10
- ·Freehand9.0全程讲解-9
特别推荐
