; 虚拟和实例方法可以是抽象的,或者是一个实现。静态方法必须总拥有一个实现。
虚拟方法可能是最后的(或者不是)。
字段(Fields)
可以是静态或者是非静态。
静态字段可以被描述或只初始化。
属性
当获取和设置方法而不是使用属性语法时,属性可以公开。
获取的返回类型和设置方法的第一个参数必须是相同的CLS类型??属性的类型。
属性名字必须不同,不同的属性类型用于区分是不充分的。
由于使用方法实现属性访问,如果 PropertyName 是同一个类中定义的一个属性,你不能实现命名为
get_PropertyName 和 set_PropertyName 的方法。
属性可以被索引。
属性访问必须遵循这种命名格式:get_ProName,set_PropName。
枚举(Enumerations)
强调类型必须是byte、short、int 或long。
每一个成员是一个枚举类型的静态描述字段。
一个枚举不能实现任何接口。
你允许给多字段设定相同的值。
一个枚举必须继承系统枚举(隐含在C#中)
异常
可以被引发和被捕获。
自定义异常必须继承系统异常。
接口
可需要实现其它接口。
一个接口可以定义属性、事件和虚拟方法。实现取决于派生类。
事件
增加和取消方法必须是都提供或者都没有 ,每一种方法采用一个参数,它是一个从系统代表元(System Delegate)派
生下来的类。
自定义属性
可以仅使用下更类型:Type(类型),char, char, bool, byte, short, int, long, float, double, enum (一种CLS
类型), and object.
代表元(Delegates)
可以被创建和被激活
标识符(Identifiers)
一个标识符的第一个字母必须来自一限制集。
通过大小写在单一范围内,不可能唯一地区别两个或更多个标识符(大小写不敏感)。
2.2.4虚拟执行系统(VES)
虚拟执行系统实现了虚拟对象系统。通过实现一个负责NGWS runtime的执行引擎(execution engine,缩写EE)创建
VES。这个执行引擎执行你用C#编写和编译的应用程序。
下列组件为VES的一部分。
1、中间语言(IL)??被设计为很容易受各种各样的编译器所兼容 。在该框架之外,C++、VB和C#编译器都能够生成
IL。
2、装入受管代码??这包括解决内存中的名字、 表层类(laying out classes ),并且创建JIT编译所必需的存根。
通过执行经常性校验,包括加强一些访问规则,类装载器同样也增强了安全性。
3、用JIT转换IL成原始代码??IL代码并不是设计成为一种传统的解释字节代码或树型代码,IL转换是真正的编译。
4、装入元数据、校验类型安全和方法的完整性
5、垃圾收集(GC)和异常处理??两者都是基于堆栈格式的服务。受管代码允许你动态地跟踪堆栈。要动态地识别各
个堆栈框架,JITter或其它编译器必须提供一个代码管理器。
6、描绘和查错服务??两者都取决于由源语言编译器所生成的信息。必须发出两个映射:一个映射从源语言结构发
到指令流中的地址,一个映射从地址发到堆栈框架中的位置。当执行从IL到原始代码的转换时,这些映射被重新计算。
7、管理线程和上下文,还有远程管理??VES为受管代码提供这些服务。
虽然这个清单并不完整,但它足以让你理解运行时基于的由VES提供的低层架构。肯定将会有专门讨论运行时的书,
而这本书将稍为深入地挖掘各种话题。
2.3 小结
这一章,我带你逛了一回运行时的世界。我描述了当创建、编译和配置C#程序时它是如何工作的。你学会了中间语言
(IL),还有元数据是如何用于描述被编译为IL的类型。元数据和IL都用于JITter检测和执行你的代码。你甚至可以选择用
哪一种JITter来执行应用程序。
在这一章的第二部分,涉及到了运行时为何按这种方式工作的理论。你学了虚拟对象系统(VOS)和组成它的那部分。
对于类库设计者最为感兴趣的就是通用语言规范(CLS),它为基于VOS的语言交互操作设定规则。最后,你看到了虚拟执行
系统(VES)如何通过NGWS runtime实现VOS。
虚拟方法可能是最后的(或者不是)。
字段(Fields)
可以是静态或者是非静态。
静态字段可以被描述或只初始化。
属性
当获取和设置方法而不是使用属性语法时,属性可以公开。
获取的返回类型和设置方法的第一个参数必须是相同的CLS类型??属性的类型。
属性名字必须不同,不同的属性类型用于区分是不充分的。
由于使用方法实现属性访问,如果 PropertyName 是同一个类中定义的一个属性,你不能实现命名为
get_PropertyName 和 set_PropertyName 的方法。
属性可以被索引。
属性访问必须遵循这种命名格式:get_ProName,set_PropName。
枚举(Enumerations)
强调类型必须是byte、short、int 或long。
每一个成员是一个枚举类型的静态描述字段。
一个枚举不能实现任何接口。
你允许给多字段设定相同的值。
一个枚举必须继承系统枚举(隐含在C#中)
异常
可以被引发和被捕获。
自定义异常必须继承系统异常。
接口
可需要实现其它接口。
一个接口可以定义属性、事件和虚拟方法。实现取决于派生类。
事件
增加和取消方法必须是都提供或者都没有 ,每一种方法采用一个参数,它是一个从系统代表元(System Delegate)派
生下来的类。
自定义属性
可以仅使用下更类型:Type(类型),char, char, bool, byte, short, int, long, float, double, enum (一种CLS
类型), and object.
代表元(Delegates)
可以被创建和被激活
标识符(Identifiers)
一个标识符的第一个字母必须来自一限制集。
通过大小写在单一范围内,不可能唯一地区别两个或更多个标识符(大小写不敏感)。
2.2.4虚拟执行系统(VES)
虚拟执行系统实现了虚拟对象系统。通过实现一个负责NGWS runtime的执行引擎(execution engine,缩写EE)创建
VES。这个执行引擎执行你用C#编写和编译的应用程序。
下列组件为VES的一部分。
1、中间语言(IL)??被设计为很容易受各种各样的编译器所兼容 。在该框架之外,C++、VB和C#编译器都能够生成
IL。
2、装入受管代码??这包括解决内存中的名字、 表层类(laying out classes ),并且创建JIT编译所必需的存根。
通过执行经常性校验,包括加强一些访问规则,类装载器同样也增强了安全性。
3、用JIT转换IL成原始代码??IL代码并不是设计成为一种传统的解释字节代码或树型代码,IL转换是真正的编译。
4、装入元数据、校验类型安全和方法的完整性
5、垃圾收集(GC)和异常处理??两者都是基于堆栈格式的服务。受管代码允许你动态地跟踪堆栈。要动态地识别各
个堆栈框架,JITter或其它编译器必须提供一个代码管理器。
6、描绘和查错服务??两者都取决于由源语言编译器所生成的信息。必须发出两个映射:一个映射从源语言结构发
到指令流中的地址,一个映射从地址发到堆栈框架中的位置。当执行从IL到原始代码的转换时,这些映射被重新计算。
7、管理线程和上下文,还有远程管理??VES为受管代码提供这些服务。
虽然这个清单并不完整,但它足以让你理解运行时基于的由VES提供的低层架构。肯定将会有专门讨论运行时的书,
而这本书将稍为深入地挖掘各种话题。
2.3 小结
这一章,我带你逛了一回运行时的世界。我描述了当创建、编译和配置C#程序时它是如何工作的。你学会了中间语言
(IL),还有元数据是如何用于描述被编译为IL的类型。元数据和IL都用于JITter检测和执行你的代码。你甚至可以选择用
哪一种JITter来执行应用程序。
在这一章的第二部分,涉及到了运行时为何按这种方式工作的理论。你学了虚拟对象系统(VOS)和组成它的那部分。
对于类库设计者最为感兴趣的就是通用语言规范(CLS),它为基于VOS的语言交互操作设定规则。最后,你看到了虚拟执行
系统(VES)如何通过NGWS runtime实现VOS。