工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 微软开发专栏 > Visual Studio.net专栏 > C# > 正文
关于Visual C#装箱与拆箱的研究
[文章信息]
作者:
时间:2004-09-15
出处:CSDN
责任编辑:方舟
[文章导读]
在对这个问题展开讨论之前,我们不妨先来问这么几个问题,以系统的了解我们今天要探究的主题
advertisement
热点推荐
· 禁止QQ登录的方法
· 给你的XML文件做个数字签名
· ImageReady制作“焰火”小动画
· Java加密和数字签名编程快速入门
· 在VB6中用命令行为模式控制GUI动作
[正文]

1 2 3  下一页

  在对这个问题展开讨论之前,我们不妨先来问这么几个问题,以系统的了解我们今天要探究的主题。

  观者也许曾无数次的使用过诸如System.Console类或.NET类库中那些品种繁多的类。那么,我想问的是它们究竟源自何处?C#又是如何联系它们?有没有支持我们个性化扩展的机制或类型系统?又有哪些类型系统可供我们使用呢?如果我们这些PL们连这些问题都不知其然,更不知其所以然的话,C#之门恐怕会把我们拒之门外的。

  那就让我们先停停手中的活儿,理理头绪,对作为.NET重要技术和基础之一的CTS(Common Type System)做一个饶有兴趣的研究。顾名思义,CTS就是为了实现在应用程序声明和使用这些类型时必须遵循的规则而存在的通用类型系统。在这要插一句,虽然也许大家都对此再熟悉不过了,但是我还是要强调,.Net将整个系统的类型分成两大类 —— 值类型 和 引用类型。到此,你也许会怒斥:说了这么半天,你似乎还没有切入正题呢!别慌!知道了.Net类型系统的的特点并不代表你真正理解了这个类型系统的原理和存在的意义。

  大多数面向对象的语言都有两种类型:原类型(语言固有的类型,如整数、枚举)和类。虽然在实现模块化和实体化方面,面向对象技术体现了很强的能力,但是也存在一些问题,比如现在提到的这个系统类型问题,历史告诉我们两组类型造成了许多问题。首先就是兼容性问题,这个也是Microsoft使劲抨击的一点,多数的OO语言存在这个弱点,原因就是因为他们的原类型没有共同的基点,于是他们在本质上并不是真正的对象,它们并不是从一个通用基类里派生来的。怪不得,Anders Heijlsberg 笑称其为“魔术类型”。

  正是由于这一缺陷,当我们希望指定一个可以接受本语言支持的任何类型的参数的Method时,同样的问题再次袭扰我们的大脑——不兼容。当然,对于C++的PL大拿,也许这个没有什么大不了的,他们会自豪的说,只要用重载的构造器为每一种原类型编写一个Wrapper Class 不就完了嘛!好吧,这样总算是能共存了,但是,接下来我们怎么从这个魔术中得到我们最关心的东东 —— 结果呢?于是,他们依然会自信的打开Boarland,熟练的编写一个重载过的函数来从刚才的那个 Wrapper Class 中获取结果。兄弟 or 姐妹们 ,在当时的历史条件下,你们的行为是创举,但是相对于现在,你将会为此付出代价 —— 效率低下。毕竟,C++更依赖于对象,而非面向对象。承认现实总比死要面子更理智一些!花这么大力气,总算把铺垫说完了,我想说的是:.Net环境的CTS 给我们带来了方便。第一、CTS中的所有东西都是对象;第二、所有的对象都源自一个基类——System.Object类型。这就是所谓的单根层次结构(singly rooted hierarchy)关于System.Object的详细资料请参考微软的技术文档。这里我们简略的谈谈上面提到过的两大类型:Value Type 和 Reference Type。

  CTS值类型的一个最大的特点是它们不能为null,言外之意就是值类型的变量总有一个值。在C#中,它包括有原类型、结构、枚举器。这里需要强调一点:在传递值类型的变量时,我们实际传递的是变量的值,而非底层对象的引用,这一点和传递引用类型的变量的情况截然不同;CTS引用类型就好像是类型安全的指针,它可以为null。它包括 如类、接口、委托、数组等类型。对比前面值类型的特点,当我们分配一个引用类型时,系统会在后台的堆栈上分配一个值(内存分配与位置)并返回对这个值的引用;当值为null时,说明没有引用或类型指向某个对象。这就意味着,我们在声明一个引用类型的变量时,被操作的是此变量的引用(地址),而不是数据。

  讨论到这个地方的时候,本篇的主角终于闪亮登场了——欲吐血或者呕吐的同志,请再忍耐一下。我想问一个问题先:在使用这种多类型系统时如何有效的拓展和提高系统的性能?也许就是在黑板上对这个问题的探讨,西雅图的那帮家伙们提出了Box(装箱) and UnBox(拆箱) 的想法。简单的说。装箱就是将值类型(value type)转换为引用类型(reference type)的过程;反之,就是拆箱。(其实这种思想早八辈子就产生了)。下面我们就进一步详细的讨论装箱和拆箱的过程。在讨论中,我们刚刚提到的问题的答案也就迎刃而解了。


1 2 3  下一页

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 用Visual C#打造个性化的IE浏览器
  • 利用Visual C#开发一个媒体播放器
  • 在IE中托管Windows Form
  • Visual C#编写实现POP3的程序
  • Visual C# 编程操作Excel
  • 英特尔澄清杨旭任职传闻 官方没宣布此消息
  • 国资委河北密制联通拆分方案
  • 垃圾邮件害人害企害国 清除垃圾邮件不手软
  • 中兴携手阿尔卡特 全球逐鹿CDMA
  • 用友总裁王文京:誓将ERP变成“大众消费”
  • 香港消费者委员会:数码相机最贵未必最好
  • 外电称中兴正评估西门子手机业务 或能并购
  • 国信办督战八大行业灾难备份 将出台国家标准
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索