七:公共语言规范(CLS)
CLR集成了很多种语言,并让它们之间可以相互访问,是因为CLR建立的标准的类型集、元数据、公共执行环境。但由于各种语言间存在着极大的差别,如区分大小写,有的不支持unsigned、操作符重载或者参数可变的方法,所以要想创建这种让别的语言能访问的程序,自己所用的编程语言只能使用其它语言都支持的那些特性。为了帮助我们更好的做到这一点,Microsoft定义了一个"公共语言规范(Common Language Specification,CLS)",如下图
如果一种语言定义了一个类型,并希望在另一种语言中使用该类型,就绝对不能在该类型的公共和受保护的成员中使用CLS外部的任何特性。否则其它编程人员使用其它语言来编写代码时,就可能无法访问该类型的成员。如以下代码:
using System;
//告诉编译器检查CLS相容的特性
[assembly: CLSCompliant(true)]
namespace SomeLibrary
{
//开始出现警告,因为类是公有的
public sealed class SomeLibraryType
{
//警告,返回值不符合CLS
public UInt32 Abc()
{
return 0;
}
//警告,仅大小写不同不符合CLS
public void abc()
{
}
//没有错误,该方法是私有的
private UInt32 ABC()
{
return 0;
}
}
}
这样写就会出现警告,因为它的公共的和受保护的成员不符合CLS特性,要想获得CLS规则的一个完整列表,请参见.NET Framework SDK文档的“跨语言互操作性(Cross-Language Interoperability)”一节。
如上代码要把类SomeLibraryType的修饰符public去掉的话一切警告也就消失,因为这样该类将使用默认修饰符internal,所以在程序集的外部不可见。顺便提一下不能改成private或protected和protected internal,因为命名空间中定义的元素无法显式声明为 private、protected 或 protected internal。