欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 »  .NET本质论第一卷:公共语言运行库教程 » 正文

本教程章节列表

.net本质论第五章:实例

创建时间:2012年11月13日 18:28  阅读次数:(3169)
分享到:
CLR的基本编程模型是基于类型、对象和值的。第3、4章的重点是类型,对于对象和值的讨论言之甚少。本章将阐明这三个概念在基于CLR的程序中是如何关联和被使用的。同样,在本章讲述的概念超越了具体的编程语言,适用于所有使用CLR的开发人员。

对象和值的比较


CLR的类型系统将对应简单值的类型同对应传统“对象”的类型区分开来。前者被称为值类型(value type);后者被称为引用类型(reference type)。值类型支持引用类型所支持的一个有限子集。尤其是值类型的实倒不会占用像对象那么多的存储开销。在限制对象的内存开销的情形下,值类型是很肯用的。特别需要注意的是,引用类型和值类型都可以有诸如字段和方法之类的成员。这意味着下面的语句是合法的:
string s=53.ToString();
在这里,53是类型( System.Int32)的一个实例,该类型有一个ToString方法。

术语object(对象)在文献和CLR文档中被多次使用。考虑到一致性,我们在这里将对象定义为:被垃圾回收的( garbage-collected,GC)堆上的CLR类型的实例。对象支持所有被其类型声明的疗法和接口。为了实现多态,对象总是以两个字段的对象头开始,这存第4章中已有说明。值类型(例如:SysLerm.Int32或System.Boolen)也是CLR类型,但值娄掣的实例不是对象,因为它们既不以对象头开始,也不会存GC堆上分配明显的实体。这使得值类型的实例比引用类型的实例在开销上要小一些。像引用类型一样,值类型可以有字段和方法。这既适用于基本数据类型,也适用于用户定义的值类型。

引用类型和值类型的基类型是不同的。所有值类型都是以System.ValueType作为基类型。System.ValueType对于CLR来说充当了一个信号,表明该类型的实例必须被区别对待。图5.1展示了CLR类型系统。注意基本数据娄型(例如,Sysetm.Int32)是syStem.valueType类型的派生类型,所有用户自定义的结构和枚举也是它的派生类型。除此之处,其他类型都是引用类型。




编程语言通常有一套内置(built-in)类型或基本数据类型。将这些内置类型映射到CLR类型是编译器的工作。CLR提供了一套相当丰富的标准数值类型、布尔类型,以及字符串类型的集合。图5.2展示了VB.NET和C#的内置类型与相应的CLR类型。注意,所有数值类型和布尔粪型都是值类型。此外,还要注意System.String是引用类型,在CLR中,Syscem.String对象是不变的(immutable),并且住被创建之后就不能被改变。这使得System.String的行为更像是一个值类型而不是引用类型,本章后面将对此进一步讨论。

基于一系列的原因,直类型不能用用基类型。为此,所有的值类型在其类型的元数据中都被标记为sealed,并且不能在类型中声明抽象力法,此外,由于值类型的实例不能作为确定的实体在堆上分配,因此,它不能有终结程序( finalizer)。这是由CLR强加的限制。C#编程语言还有另外一个限制,那就是值类型不能有默认构造函数。由于缺乏默认构造函数,因而当构造一个值类型的实例时,CLR简单地将值类型的所有字段设置为其默认值。最后.因为值类型的实例没有对象头,所以在值类型上的方法调用不使用虚方法分发,这提高了性能但损失了一些灵活性。
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 33+24=? 的结果(结果是:57)
结  果: