CLS(公共语言规范)

  • CLS(公共语言规范)已关闭评论
  • 211 次浏览
  • A+
所属分类:.NET技术
摘要

为了方便加深理解,我准备先讲解一个例子来映衬出CLS的主要作用。 每个国家在成立之后肯定会于他国之间建立外交关系从而进行一些贸易往来,刚开始可能只会存在与一两个国家达成了合作,所以只会与少数的国家进行贸易往来。在进行贸易往来前为了沟通顺畅,国家之间交流的语言必须要一致,这个时候通常的方式是:A国家去学习B国家的语言,又或者B国家去学习A国家,从而实现语言沟通顺畅。

1.举例

为了方便加深理解,我准备先讲解一个例子来映衬出CLS的主要作用。

每个国家在成立之后肯定会于他国之间建立外交关系从而进行一些贸易往来,刚开始可能只会存在与一两个国家达成了合作,所以只会与少数的国家进行贸易往来。在进行贸易往来前为了沟通顺畅,国家之间交流的语言必须要一致,这个时候通常的方式是:A国家去学习B国家的语言,又或者B国家去学习A国家,从而实现语言沟通顺畅。

 

随着国家的不断壮大,那么能够外交合作的国家会越来越多,如果还是按照上面的方式建立语言的沟通方式,这个时候就有一个问题:即如果外交国有N个,那么就要学习N个国家的语言。虽然可以这么做,但这并不是一种科学的方式。基于这种现象就诞生出了一种通用语言,这个通用语言从而打破了所有国家之间交流的屏障。当然,在我们现实生活中也存在着这种国际通用语言,那就是英语。

 

2.主要作用

在.Net平台中同样会出现上面例子中问题。假设你在.Net平台下设计了一门语言叫N#,那么在没有一套通用语言规范的前提下,你可以去引用C#编写的程序集从而实现交互吗?答案显然是不能。即使是你和C#一样可以完美的在.Net框架下运行,但是它们之间没有共通之处。

 

这个时候你可能会像上面的例子一样,去学习C#语言从而实现一些共通之处,从而实现两个不同语言项目间的引用。但是你要搞清楚,在.Net平台下不会仅仅只有你们两种编程语言存在,并且.Net的设计目标是实现一个开放的平台,也意外着它会存在多种语言,我们不可能为了引用一个语言就跟这个语言建立一种独立的沟通方式。

 

因此就需要一套规范和标准来实现各语言间的共通之处,即使是要引用或被引用N个不同的语言项目,只要大家就遵循这个规范,就能实现跨语言的程序集引用。那么在.Net中的这个规范就叫做CLS(Common Language Specification,公共语言规范)

 

3.实现引用不代表公开

在我们有了CLS的语言规范后实现了不同语言项目之间的程序集引用,但在多个程序集之间引用的时候,并不意味者某个程序集必须将自己所有的内容提供给对方程序集,而仅仅是针对程序集中公开的(public)部分,而其中不公开的部分(private、internal、protected)是不会被对方获取到的。所以在遵循CLS规范的同时也需要衡量下,那些需要提供给对方,那些不需要,然后你只针对对方需要的部分进行公开(public)。

 

4.具体的规范

上面已经讲了CLS的主要作用和一些细节,但这些只是停留在概念上,下面我举几个CLS当中实际的规范,以便加深理解。

4.1.命名约定

有些编程语言的不区分大小写的,但是CLS规范中就必须要求区分大小写。下面我们通过一个代码示例来证明这一规范。

CLS(公共语言规范)

图中首先要说明的就是在命名空间上标识的特性:[assembly: CLSCompliant(true)],这个特性的作用是便于我们在编译前检查程序集中的代码是否符合CLS的规范。从上图结果来看显然是不符合的,因为CLS是区分大小写的,它会将Person和person作为同一个类,但是上面的C#代码并没进行大小写区分。

另外还要注意的一点,就是特性[assembly: CLSCompliant(true)],检查出不符合CLS的规范时,只会给出警告,并不会标识为错误。你可以忽略,但是这代表这个程序集不能由其他语言编写的程序集所引用。

4.2.构造函数

CLS对构造函数的一个规范是:一个类如果有继承关系,那么子类必须要调用父类的构造函数。下面我们通过一个代码示例来证明这一规范。

CLS(公共语言规范)

Doctor类中并没有调用其父类Person的构造函数,所以是不符合CLS规范。这个规范和上面的规范有不同之处,因为C#本身已经包含了和CLS相同的规范,那么这个规范在C#中就作为强制的了,直接提示出了错误而非警告。

 

关于CLS具体的规范还有很多,本文不在这里一一展开,本文旨在对CLS(公共语言规范)有一个初步的理解,如果需要详细的深入,可以浏览.Net官方地址:

https://docs.microsoft.com/zh-cn/dotnet/standard/language-independence