第二章 3.Net本质论中文版.docVIP

  1. 1、本文档共28页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三章 类型基础 第二章阐述了基于CLR的程序是如何由一个或多个“分子”——程序集构建的。而这些程序集是由一个或多个“原子”——模块构建的。本章将进一步细分“原子”,即把模块分为“亚原子”——类型。本章的重点是通用类型系统[Common Type System(CTS)],它超出了某个特定编程语言的范畴。不过,为了更加直观地说明CTS,我们需要选择一门编程语言,作为通用类型的载体。因此,本章以C#编程语言为例,阐述CTS的概念和机制。读者不必过多地关注编程语言的语法,而应将重点放在CTS的核心概念上。 类型概述 类型是CLR程序的生成块(building block)。一旦开发人员确定了如何把工程划分成一个或多个程序集,那么,他们大部分的时间都在考虑类型是如何工作的,以及类型之间是如何相互联系的。编程语言(例如,C#和VB.NET)都有几种表示类型的构件(例如,类、结构、枚举等),但最终所有这些类型,都会映射到CLR的类型定义。 CLR类型(CLR type)是命名的可重用的抽象体。CLR类型的描述存放在CLR模块的元数据中。该模块还包含使类型工作所需要的CIL或者本机代码。完全限定的CLR类型名包括三个部分:程序集名字、可选的命名空间前缀和类型名称。你可以通过第二章描述的自定义特性来控制程序集名字;并且使用多个不同的编程语言构件来控制命名空间前缀和类型名称。例如, 示例3.1中的C#代码定义了一个类型,它的类型名称是Customer,命名空间前缀是AcmCorp.LOB。如第二章中所描述的,命名空间前缀通常与程序集名字匹配,但这只是一个约定,并非刻意的要求。 示例3.1:在C#中定义一个类型 namespace AcmeCorp.LOB { public sealed class Customer { // 类型名是AcmeCorp.LOB.Customer } } CLR类型定义由零个或多个成员(member)组成。类型的成员控制类型如何使用,以及类型如何工作。类型的每个成员都有自己的访问修饰符(access modifier)(例如,public、internal)控制对于成员的访问。类型的可访问成员将被经常引用,组合在一起就是类型的合同(contract)。 除了控制对给定成员的访问,开发人员还能够控制类型的实例是否需要访问该成员。多数成员能被定义为按实例(per instance)或按类型(per type)访问。按实例访问成员(per-instance member)需要通过这个类型的实例才能访问它。按类型访问成员(per-type member)则没有这种要求。在C#或VB.NET中的成员默认是按实例访问的,你可以通过关键字将它改成按类型访问。例如,在C#中这个关键字是static ,VB.NET中则是Shared。 CTS有三种基本类型的成员:字段、方法和嵌套类型。字段是一个命名的存储单元,它隶属于所声明的类型。方法是一个命名的操作,它可以被调用和执行。嵌套类型则是一种简单的辅助类型,它被定义为声明类型的实现的一部分。所有其他类型成员(例如:属性、事件)是以附加元数据的形式出现的方法。 类型的字段控制内存如何分配。CLR使用类型的字段来决定分配多少内存给这个类型。CLR会给static字段分配一次内存:即在类型被首次加载的时候。CLR每次分配一个类型实例时,都会为non-static(instance)[非静态(实例)]字段分配内存。在分配内存时,CLR初始化所有的static字段,并且为它们赋予默认值。对于数值类型,默认值是零;对于布尔类型,默认值是false;对于对象引用,默认值是null。CLR也会初始化堆分配的(heap-allocated)实例字段,同样赋予上述默认值。 CLR保证static字段和堆分配(heap-allocated)实例的字段的初始化状态。CLR将把局部变量分配在堆栈中。你可以通过添加特性到给定方法的元数据中,以标明该方法的局部变量将被自动初始化为它的默认值。例如,VB.NET语言添加这个特性后,CLR将自动初始化局部变量作为方法序幕(prolog)的一部分。C#编译器也添加了这个特性;然而,C#需要局部变量被显式地初始化。为避免引入安全漏洞,CLR验证器需要这个特性出现在可验证的方法(verifiable methods)上。 看一个使用字段的例子,考虑示例3.2的C#代码。字段声明的注释标明了CLR给字段分配内存时所使用的初始化值。就customerCount来说,类型 被首次使用之前内存会被分配和初始化。对于所有其他字段,每当新的AcmCorp.LOB实例被分配在堆上时,内存都会被分配和初始化。如图3.1所示。注意在这个例子中balance字段有多份拷贝,但cu

文档评论(0)

xiaofei2001128 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档