.NET中的“ CLSCompliant”属性是什么?


Answers:


181

CLSCompliant当您要确保属性可以被任何其他.NET语言使用时,可以使用该属性标记类。
这些是基本规则:

  1. 无符号类型不应成为该类的公共接口的一部分。这意味着公共字段不应具有未签名的类型,例如uintulong,公共方法不应返回未签名的类型,传递给公共函数的参数不应具有未签名的类型。但是,未签名的类型可以是私有成员的一部分。

  2. 成员不应该使用指针之类的不安全类型public。但是,它们可以与private成员一起使用。

  3. 类名和成员名不应仅因大小写而异。例如,我们不能有两个名为MyMethod和的方法MYMETHOD

  4. 只能重载属性和方法,不应重载运算符。


您会默认每个项目吗?
Naeem Sarfraz

3
不一定,主要是针对那些可能接触其他.net语言的用户。
奥塔维奥·德西奥

1
另一个限制是CS3006:重载的方法“ Foo.Bar(ref Baz)”仅在ref或out或数组等级上不同,不符合CLS
Drew Noakes

还有一点:公共标识符不应以下划线字符开头。
克罗诺

44

它告诉您代码的其他使用者它是CLS兼容的,并且还使C#编译器为您检查它是否符合CLS。

被引用的文章包含有关CLS合规性的更多详细信息。


12
因此,如果我添加属性,然后毫无抱怨地构建我的项目,那意味着我的项目符合CLS,一切都很好吗?
Svish 2012年

@Svish,是的。如果您违反任何规则,编译器都会通知您。
Drew Noakes '18

41

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

遵守CLS意味着您可以编写可以在CLR上编译和运行的任何语言都可以使用的代码。但是,不需要CLS遵从性,这使您可以在难以或无法做到CLS遵从性的情况下灵活地进行操作。

如果您打算将代码供其他开发人员使用,则您的API(您的公共类和方法)应符合CLS。您应该通过将CLSCompliantAttribute添加到程序集中来声明这一点。如果您不是为他人而写,那么尽管FxCop框架警察)会不同意我的观点,但没有必要遵循CLS 。

当您的程序集标记有CLSCompliantAttribute时,编译器将(应该!)检查您的代码,以查看在编译时它是否违反任何CLS规则(提到了某些ocdecio)并向您报告违反情况以进行修复。


FxCop带我来了这里。
Teoman shipahi 2015年

不幸的是,CLR的大视野具有许多不同的前端语言(例如VB.NET-快死了,而其他语言则消失了,例如MC ++,Delphi.NET,Oxygene,J#,JScript.NET等)限制鉴于支持其他CLR的其他其余语言在支持非CLSCompliant功能(例如可选参数和out参数)方面没有问题,因此完成CLSCompliance的好处-因此我认为Microsoft需要重新审查CLS的要求并可能放宽它们。

13

符合CLS的要求是CLR允许的全部语言范围的子集。它将其限制为大多数针对CLR的语言可能提供的子集。这会增加(但不能保证)您的库可以被所有面向CLR的语言使用。


8

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

[assembly:CLSCompliant(true)]

或等效地在VB.NET中(AssemblyInfo.vb隐藏在“我的项目”下)

<Assembly: CLSCompliant(True)>

感谢使您的代码符合CLS

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.