2.2.3通用语言规范 通用语言规范(CLS)并不是虚拟对象系统(VOS)真正的一部分,它是特殊的。CLS定义了VOS中的一个类型子集,也定义了必须符合CLS的常规用法。 那么,对此有什么迷惑呢?如果一个类库遵守CLS规则,其它编程语言同样也遵守CLS规则,那么其它编程语言的客户也可以使用类库。CLS是关于语言的交互可操作性(interoperability)。因此,常规用法必须仅遵循外部可访问项目 (externally visible items)如方法、属性和事件等等。 我所描述的优点是你可以做以下工作。用C#写一个组件,在VB中派生它,因加在VB中的功能是如此之强大,在C#中再次从VB类派生它。只要所有的外部可访问项遵守CLS规则,这样是可行的。 我在这本书中出示的代码不关心CLS协定。但在构建你的类库时要注意到CLS协定。我提供了表2.1,用以给类型和外部可访问项定义协定规则。 这个清单不完整。它仅包含一些很重要的项目。我不指出出现在本书中每一种类型的CLS协定,所以有个好主意:当你寻找CLS协定时,至少应该用浏览该表,以了解哪种功能有效。不要担心你不熟悉这章表中的每一个含义,在这本书中你会学到它们。 表2.1 通能语言规范中的类型和功能 bool char byte short int long float double string object(所有对象之母) Arrays(数组) 数组的维数必须是已知的(>=1),而且最小下标数必须为0。 要素类型必须是一个CLS类型。
类型(Types) 可以被抽象或隐藏。 零或更多的接口可以被实现。不同的接口允许拥有具有相同名字和签名的方法。 一个类型可以准确地从一个类型派生。允许成员被覆盖和被隐藏。 可以有零或更多的成员,它们是字段(fields)、方法、事件或者类型。 类型可以拥有零或更多个构造函数。 一种类型的可访问性可以是公共的或者对NGWS组件来说是局部的;但是,仅公共成员可以认为是类型接口的一部分。 所有的值型必须从系统值型继承。异常是一个枚举——它必须从系统枚举(System Enum)继承。 类型成员 类型成员允许隐藏或者覆盖另一种类型中的其它成员。 参数和返回值的类型都必须是 CLS 协定 类型。 构造函数、方法和属性可以被重载。 一个类型可以有抽象成员,但仅当类型不被封装时。 方法 一种方法可以是静态、虚拟或者实例。 虚拟和实例方法可以是抽象的,或者是一个实现。静态方法必须总拥有一个实现。 虚拟方法可能是最后的(或者不是)。 字段(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 首页 上一页 1 2 |