通用语言规范(CLS)并不是虚拟对象系统(VOS)真正的一部分,它是特殊的。CLS定义了VOS中的一个类型子集,也定义了必须符合CLS的常规用法。
那么,对此有什么迷惑呢?如果一个类库遵守CLS规则,其它编程语言同样也遵守CLS规则,那么其它编程语言的客户也可以使用类库。CLS是关于语言的交互可操作性(interoperability)。因此,常规用法必须仅遵循外部可访问项目 (externally visible items)如方法、属性和事件等等。
我所描述的优点是你可以做以下工作。用C#写一个组件,在VB中派生它,因加在VB中的功能是如此之强大,在C#中再次从VB类派生它。只要所有的外部可访问项遵守CLS规则,这样是可行的。
我在这本书中出示的代码不关心CLS协定。但在构建你的类库时要注意到CLS协定。
这个清单不完整。它仅包含一些很重要的项目。我不指出出现在本书中每一种类型的CLS协定,所以有个好主意:当你寻找CLS协定时,至少应该浏览该表,以了解哪种功能有效。不要担心你不熟悉这张表中的每一个含义,在这本书中你会学到它们。
通能语言规范中的类型和功能
·bool ·char ·byte ·short ·int ·long ·float ·double ·string ·object(所有对象之母)
Arrays(数组)
数组的维数必须是已知的(>=1),而且最小下标数必须为0。
元素类型必须是一个CLS类型。
类型(Types)
可以被抽象或隐藏。
零或更多的接口可以被实现。不同的接口允许拥有具有相同名字和签名的方法。
一个类型可以准确地从一个类型派生。允许成员被覆盖和被隐藏。
可以有零或更多的成员,它们是域成员、方法、事件或者类型。
类型可以拥有零或更多个构造函数。
一种类型的可访问性可以是公共的或者对NGWS组件来说是局部的;但是,只有公共成员可以认为是类型接口的一部分。
所有的值型必须从系统值型继承。异常是一个枚举——它必须从系统枚举(System Enum)继承。
类型成员
类型成员允许隐藏或者覆盖另一种类型中的其它成员。
参数和返回值的类型都必须是 CLS 协定类型。
构造函数、方法和属性可以被重载。
一个类型可以有抽象成员,但仅当类型不被封装时。
方法
一种方法可以是静态、虚拟或者实例。
虚拟和实例方法可以是抽象的,或者是一个实现。静态方法必须总拥有一个实现。
虚拟方法可能是最后的(或者不是)。
域成员
可以是静态或者是非静态。
静态域成员可以被描述或只初始化。
属性
当获取和设置方法而不是使用属性语法时,属性可以公开。
获取的返回类型和设置方法的第一个参数必须是相同的CLS类型——属性的类型。
属性名字必须不同,不同的属性类型用于区分是不充分的。
由于使用方法实现属性访问,如果 PropertyName 是同一个类中定义的一个属性,你不能实现命名为 get_PropertyName 和 set_PropertyName 的方法。
属性可以被索引。
属性访问必须遵循这种命名格式:get_ProName,set_PropName。
枚举
强调类型必须是byte、short、int 或long。
每一个成员是一个枚举类型的静态描述域成员
一个枚举不能实现任何接口。
你允许给多个域成员设定相同的值。
一个枚举必须继承系统枚举(隐含在C#中)
异常
可以被引发和被捕获。
自定义异常必须继承系统异常。
接口
可需要实现其它接口。
一个接口可以定义属性、事件和虚拟方法。实现取决于派生类。
事件
要么都进行增加方法和取消方法,要么都不进行。每一种方法采用一个参数,它是从系统代表元(System Delegate)派生下来的一个类。
自定义属性
可以仅使用下列类型:Type(类型),char, char, bool, byte, short, int, long, float, double, enum (一种CLS 类型), and object.
代表元(Delegates)
可以被创建和被激活
标识符(Identifiers)
一个标识符的第一个字母必须来自一限制集。
通过大小写在单一范围内,不可能唯一地区别两个或更多个标识符(大小写不敏感)。
新闻热点
疑难解答
图片精选