【问题标题】:What is the 'CLSCompliant' attribute in .NET?.NET 中的“CLSCompliant”属性是什么?
【发布时间】:2009-02-20 17:15:39
【问题描述】:

CLSCompliant 属性是什么?

【问题讨论】:

    标签: .net cls-compliant


    【解决方案1】:

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

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

    2. pointers 等不安全类型不应与public 成员一起使用。但是它们可以与private 成员一起使用。

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

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

    【讨论】:

    • 你会在每个项目中默认这样做吗?
    • 不一定,主要针对那些可能接触过其他 .net 语言的人。
    • 另一个限制是 CS3006:重载的方法 'Foo.Bar(ref Baz)' 仅在 ref 或 out 或数组排名方面不同,不符合 CLS跨度>
    • 还有一点:公共标识符不应该以下划线开头。
    【解决方案2】:

    它告诉您的代码的其他使用者它是CLS compliant,并让 C# 编译器检查它是否符合 CLS。

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

    【讨论】:

    • 那么,如果我添加了属性,然后毫无怨言地构建了我的项目,这是否意味着我的项目符合 CLS 并且一切正常?
    • @Svish,是的,就是这样。如果您违反任何规则,编译器会通知您。
    【解决方案3】:

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

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

    如果您打算让其他开发人员使用您的代码,那么您的 API(您的公共类和方法)应该符合 CLS。您应该通过将 CLSCompliantAttribute 添加到您的程序集来声明这一点。如果您不是为他人写作,则无需遵守 CLS,尽管 FxCopFramework Cop)不同意我的观点。

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

    【讨论】:

    • FxCop 把我带到了这里。
    • 不幸的是,CLR 的宏大愿景拥有许多不同的前端语言(如 VB.NET——它正在慢慢消亡——而其他的现在已经消失了,如 MC++、Delphi.NET、Oxygene、J#、JScript .NET 等)限制了完成 CLSCompliance 的好处,因为支持 CLR 的其他剩余语言支持非 CLSCompliant 功能(如可选参数和out 参数)没有问题 - 所以我认为微软需要重新审视 CLS 的要求或许可以松开它们。
    • Oxygene 和其他 Elements 语言仍以 CLR 为目标。
    【解决方案4】:

    符合 CLS 是 CLR 允许的完整语言范围的子集。它将其限制为大多数以 CLR 为目标的语言可能可用的子集。这会增加,但不能保证所有面向 CLR 的语言都可以使用您的库。

    【讨论】:

      【解决方案5】:

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

      [assembly:CLSCompliant(true)]
      

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

      <Assembly: CLSCompliant(True)>
      

      感谢Making Your Code CLS Compliant

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 2012-07-29
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多