Otá*_*cio 172

如果要确保可以由任何其他.NET语言使用,请使用CLSCompliant属性标记类.这些是基本规则:

  1. 无符号类型不应该是类的公共接口的一部分.这意味着公共字段不应该有uint或ulong等无符号类型,公共方法不应该返回无符号类型,传递给公共函数的参数不应该有无符号类型.但是,无符号类型可以是私有成员的一部分.

  2. 指针等不安全类型不应与公共成员一起使用.但是,它们可以与私人成员一起使用.

  3. 类名和成员名不应仅根据具体情况而有所不同.例如,我们不能有两个名为MyMethod和MYMETHOD的方法.

  4. 只有属性和方法可能会重载,操作符不应该重载.

  • 不一定,主要是那些可能接触过其他.net语言的人. (3认同)
  • 还有一点:公共标识符不应以下划线字符开头。 (3认同)
  • 另一个限制是 _CS3006:重载方法 'Foo.Bar(ref Baz)' 仅在 ref 或 out 或数组排名方面不同,不符合 CLS_ (2认同)

Jon*_*eet 44

它告诉其他消费者您的代码是否符合CLS,并且还使C#编译器检查它是否符合CLS.

引用的文章包含有关CLS合规性所需的更多详细信息.

  • 因此,如果我添加属性然后构建我的项目没有抱怨,这意味着我的项目符合CLS并且一切都很好? (12认同)
  • @Svish,是的,就是这样。如果您违反任何规则,编译器会通知您。 (2认同)

小智 38

其他答案都是正确的.让我澄清一些事情--CLS代表公共语言规范.它是.NET语言必须实现和理解的最小规则集和所需的语言功能.该集合是公共类型系统的子集,它定义了如何在.NET中定义类型.

符合CLS意味着您可以编写可以在CLR上编译和运行的任何语言使用的代码.但是不需要CLS合规性,在CLS合规难以或不可能的情况下为您提供灵活性.

如果您希望您的代码被其他开发人员使用,那么您的API(您的公共类和方法)应该符合CLS.您应该通过将CLSCompliantAttribute添加到程序集来声明这一点.如果您不是为他人写作,则不需要CLS合规,尽管FxCop(Framework Cop)会不同意我的看法.

当您的程序集标记有CLSCompliantAttribute时,编译器将(应该!)检查您的代码,以查看在编译时是否会违反任何CLS规则(其中一些提及ocdecio)并向您报告违规行为以进行修复.


Jar*_*Par 13

符合CLS是CLR允许的完整语言频谱的子集.它将其限制为可能由目标CLR的大多数语言可用的子集.这增加了但不保证您的库可以被所有针对CLR的语言使用.


Mar*_*air 8

适用于此处:要标记整个项目符合CLS,请将此行添加到AssemblyInfo.cs(可在"解决方案资源管理器"中的"属性"下找到)

[assembly:CLSCompliant(true)]
Run Code Online (Sandbox Code Playgroud)

或等效于VB.NET(AssemblyInfo.vb隐藏在My Project下)

<Assembly: CLSCompliant(True)>
Run Code Online (Sandbox Code Playgroud)

感谢您使您的代码符合CLS标准.