欢迎来到天天文库
浏览记录
ID:60740954
大小:528.00 KB
页数:50页
时间:2020-02-02
《第2章公共语言运行库.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1第二章公共语言运行库2.1开发托管代码:通用类型系统(CTS)2.2通用类型系统架构2.3特殊系统类型2.4小结2.1开发托管代码:通用类型系统CTS编程语言是什么?有一种看法是把它当成拥有一套关键字的特定语法,这些关键字可用于定义数据,并表达实施于数据上的操作。尽管编程语言的语法各有差别,但大多数流行语言的潜在抽象性其实十分相似,它们都支持形形色色的数据类型(如整型和字符型),都可将代码包装于方法(函数)之中,并且都提供一个将数据和方法聚合于类的办法。定义一个崭新的编程语言时,常规做法是先定义诸如关键语义的抽象性,然后才是语法。2.1开发托管代码:通用类型系统CT
2、S与此同时,亦存在另一种可能性。假设为一个编程模型定义核心抽象性质,而且不把它映射到任何特定语法上,如果抽象性够一般化,它就可以被用于多种不同的编程语言中。让语法和语义保持隔离,允许不同的语言使用同一套潜在抽象性,这正是CLR的通用类型系统(CommonTypeSystem,CTS)的功能。CTS并未规定特定语法或关键字,只是定义了一套通用类型,它们可用于许多语言的语法上。每一种语言都可以自由定义它所希望的任何语法,但如果某个语言基于CLR,它将至少使用CTS定义的一部分类型。2.1开发托管代码:通用类型系统CTS对任何一门编程语言来说,类型都是基础性的东西。想像某种
3、类型的一个形象的方法是,把它当做一套“用来解释存储在某内存位置上的值(如变量的值)”的规则。例如,如果变量的类型是整数,变量的值就被解释为一个整数;如果变量的类型是字符串,变量的值就被解释为一组字符。当然,对编译器来说,类型的含义远不止于此,编译器还必须能够理解以下规则:“定义每一种类型能够接受的值”,以及“对这些值来说哪些操作合法”。利用这些知识以及其他信息,编译器便能够决定一个特定类型的值是否被正确使用。2.1开发托管代码:通用类型系统CTSCTS定义的一整套类型在CLR中居核心位置。基于CLR的编程语言以一种语言相依方式来使用这些类型。尽管一个基于CLR的编程语
4、言的创造者可以自由实现CTS定义类型的任何子集,甚至加入自己的类型,但大多数基于CLR的语言还是广泛地采用了CTS所定义的类型。2.2通用类型系统架构2.2.1值类型和引用类型2.2.2值类型和引用类型之间的相互转换:装箱和拆箱2.2通用类型系统架构图2.1显示了CTS定义的大部分类型的子集。值得注意的是:①每种类型都直接或间接继承名为Object的类型②CTS定义的每一个类型不是引用类型就是值类型。顾名思义,引用类型的实例总是包含对该类型的值的引用,而值类型的实例包含值本身。引用类型直接继承Object(如String类),值类型直接继承名为ValueType的类型
5、(如Int32型),而ValueType类型同样继承自Object。2.2通用类型系统架构值类型和引用类型值类型继承自ValueType,值类型的变量直接存储数据,被分配在堆栈中,并且永远不可能为空。这一类的变量类型包括字节型、字符型、各种长度的有符号和无符号整型、单精度和双精度浮点型、十进制类型、布尔类型等。值类型和引用类型引用类型继承自Object,引用类型实例存储的是数据在内存中的地址,被分配在可以进行垃圾回收的堆中。由于一份数据可以被多个变量引用,使用这种变量类型能够起到节省内存资源的作用;但是一个引用对数据进行的修改也会影响到其他的引用,因为它们都指向同一个
6、数据源。引用类型的变量可以为空,表示它不指向任何对象。与值类型相比,引用类型通常更为复杂,例如,类、接口、数组和字符串都是引用类型,如图2.1所示。值类型和引用类型接下来介绍值类型和引用类型之间的区别。CTS中,必须了解的基本特点是内存如何分配给每种类型的实例。在托管代码中,值可通过两种主要方式中的任一种分配其内存,两种方式都是由CLR管理:在堆栈(Stack)中分配或在堆(Heap)中分配。值类型和引用类型分配在托管堆栈中的变量通常是在调用方法时或者正在运行的方法创建这些变量时创建,无论哪种情况,堆栈变量所使用的内存将在创建它们的方法返回时自动获得释放。但是,分配在
7、托管堆上的变量不会在创建它们的方法结束时释放其内存。相反,这些变量所使用的内存通过称为垃圾回收的过程进行释放。值类型和引用类型例如,在一个方法中声明了4个内存变量,3个值类型Int16、Char和Int32(临时变量A)的数据在托管堆栈上创建,而引用类型String(变量B)的一个实例存在于托管堆上,如图2.2所示。A的值是169,在该方法调用返回时,A在堆栈上所占用的内存将会自动释放。B指向的值是Hello,在该方法调用返回时,B在堆栈上所占用的内存将会自动释放,但是在堆上的值会在垃圾回收时才释放。值类型和引用类型图2.2值类型和应用类型值类型和引
此文档下载收益归作者所有