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

什么是CLSCompliant属性?

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

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

  2. 像指针这样的不安全types不应该与公共成员一起使用。 但是,他们可以与私人成员一起使用。

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

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

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

引用的文章包含更多关于CLS遵从性所需的更多细节。

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

与CLS兼容意味着您可以编写可以在CLR上编译和运行的任何语言使用的代码。 但是不需要CLS遵从性,在CLS遵从性很难或不可行的情况下给予灵活性。

如果你打算让你的代码被其他开发者使用,你的API(你的公共类和方法)应该是CLS兼容的。 您应该通过将CLSCompliantAttribute添加到您的程序集来声明。 如果你不是为别人写信,CLS合规是没有必要的,虽然FxCop ( 框架警察)会不同意我。

当你的程序集被标记为CLSCompliantAttribute时,编译器将(应该)检查你的代码,看它是否在编译时违反任何CLS规则(其中一些ocdecio提到),并向你报告违规行为。

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

正如它适合在这里:要标记整个项目符合CLS将此行添加到AssemblyInfo.cs (可以在解决scheme资源pipe理器中的属性下find)

 [assembly:CLSCompliant(true)] 

或在VB.NET中等价( AssemblyInfo.vb隐藏在我的项目下)

 <Assembly: CLSCompliant(True)> 

感谢让你的代码符合CLS 。