2008年11月3日星期一

CLR via C#学习笔记(4)--CTS和CLS

继续上回提到的CTS,CTS还提到了类型可视性规则以及类型成员的访问规则。比如,任何程序集都能看到并访问一个公共类型,另一方面,将一个类型标记为程序集的时候,这个类型只有在同一个程序集的内部才是可见的,而且只能从这个程序集的内部来访问。因此也可以这么理解:通过CTS制定的规则,程序集为一个类型建立了一个可视化的边界,同时CLR则用于来强制维护这些可视性规则。调用者可见的一个类型可以进一步限制调用者访问同类型成员的能力,下面列出了用于控制成员访问的各种有效选项:

private: 方法只能由同一个class中的其他方法去调用

family: 方法可由派生类型调用,无论那些类型是否在同一个程序集中(C#中用protected来标识family)

family和 assembly: 方法可由派生类型调用,但这些派生类型必须是在同一个程序集中定义的(注意是"和",像C#和VB中并没有提供这样的访问控制)

assembly: 方法可由同一个程序集中的任何代码调用(C#中用internal来标识assembly)

family和assembly: 方法可由任何程序集中的派生类型调用,也可由同一程序集中的任何类型来调用(C#中使用protected internal来标识"family或assembly")

public: 方法可由任何程序集的任何方法调用

同时,CTS还定义了对类型继承、虚方法、对象生存期等进行管理的规则。

接下来说说CLS吧。

COM允许用不同语言创建的对象相互通信。另一方面,CLR集成了所有语言,并允许在一种语言中使用由另外一种语言创建的对象。之所以可以做到这样的集成,是因为CLR建立了标准的类型集、元数据(自描述性的类型信息)以及公共执行环境。

虽然语言间的集成是一个很不错的目标,但是这中间存在一个很大的问题:各种编程语言之间有很大的区别,比如说VB在处理符号的时候并不区分大小写,而有的语言不支持unsigned类型、操作符重载。

所以说,如果想要创建很容易从其他编程语言中访问的类型,那么在自己的编程语言中提供的所有特性中,只能选用其他所有语言都保证支持的那一些。为了做到这一点,MS定义了一个Common Language Specification,它详细的定义了一个最小特性集。对于任何编译器厂商的编译器产品所生成的类型,如果他们要兼容位于CLR顶部的、支持CLS的其他语言,就必须得支持这个最小的特性集。

CLR/CTS支持的特性要比CLS定义的子集丰富的多,所以,如果不关心语言之间的互操作性的话,完全可以开发一套非常丰富的类型,而且这些类型仅受语言的特性集的限制。要注意的是:外部可见的类型和方法如果要从任何CLS相容的编程语言访问,就必须遵从CLS定义的规则。当然,如果代码只需要从定义程序集的内部访问,CLS规则就不适用了。

CLR/CTS提供了一个特性集:多数语言只是揭示了CLR/CTS的一个子集,如果程序员用IL来编写程序的话,那么他可以使用到CLR/CTS提供的全部特性,但是考虑到这种复杂性,大多数开发人员还是倾向于C#,VB这类语言,不过,C#、VB只向开发人员揭示了CLR/CTS的一个子集。

没有评论: