CLS----公共语言规范

来源:互联网 发布:cname 增加域名绑定 编辑:程序博客网 时间:2024/05/13 06:51

转自:http://blog.csdn.net/shanyongxu/article/details/50889679,请点击链接查看原文,尊重楼主大大的版权。


CLS----公共语言规范

 

前面说过了关于CTS是一套语言的规则定义,就可以开发一套语言来符合CTS.假设你新开发的言叫做N#,它所实现的CTS非常有限,仅实现了其中很少的一部分功能,它与CTSC#语言的关系可能如图这样:

 

 

那么现在就有一个问题:C#编写的程序集,能够引用由N#编程的程序集吗?肯定不能,虽然C#N#同属于CTS旗下,但是它们并没有共同之处,因此虽然单独的N#C#程序可以完美的在.NET框架下运行,但是它们之间却无法相互引用.如果使用N#开发项目的开发者本来就不希望其它语言类型的项目来引用他的项目倒也罢了,但是,如果N#项目期望其他语言类型的项目能够对它进行引用,就需要N#中公开的类型和功能满足C#语言的特性,即它们需要有共通之处.注意,这句话中的有一个词很重要,就是”公开的”(public).N#中不公开的部分(private,internal,protected)是不受影响的,可以使用独有的语言特性,因为这些不公开的部分本来就不允许外部进行访问.因此,如果N#想要被C#所理解和引用,它公开的部分就要满足C#的一些规范,此时它与CTSC#语言的关系就变成这样了:

 

 

如果世界上仅有两种语言就好办了,把它们共同的语言特性提取出来,然后要求所有公开的类型都满足这些语言特性,这样C#N#程序集就可以相互引用了.可问题是:语言类型有上百种,并且.NET的设计目标是实现一个开放的平台,不仅现有的语言经过简单的修改就能够在.NET框架上运行,后续开发的新语言也可以,而新语言此时并不存在,如何提取它的语言特性?因此又需要一套规范和标准来定义一些常见的,大多数语言都共有的语言特性.对于未来的新语言,只要它公开的部分能够满足这些规范,就能够被其他语言的程序集所使用.这个规范就叫做CLS(Common Language Specification,公共语言规范).很明显,CLSCTS的一个子集.现在引入了CLS,关系图就变了:

 

如果利用C#开发的一个程序集的公开部分仅采用了CLS中的特性,那么这个程序集就较早CLS兼容程序集.显然,对于上面提到的FCL框架类库,其中的类型都符合CLS,仅有极个别类型的成员不符合CLS,这就保证了所有面向.NET的语言都可以使用框架类库中的类型.

 

大家如果对啥叫”语言特性”感兴趣的话,我可以稍微说一下,所谓的语言特性无非就是一些规定:是否区分大小写,标识符的命名规则如何,可以使用的基本类型有哪些,构造函数的调用方式(是否会调用基类构造函数),支持的访问修饰符等.

 

那么我们如何检验程序集是否符合CLS?.NET为我们提供了一个特性CLSCompliant,便于在编译时检查程序集是否符合CLS.关于CLSCompliant的内容,应为楼主了解的不多,这里不多说了.

0 0