【问题标题】:Why should I write CLS compliant code?为什么要编写符合 CLS 的代码?
【发布时间】:2009-12-01 20:11:39
【问题描述】:

我找到了很多关于 CLS 合规性的页面。

我了解 CLS 合规性:

许多人写道:“如果您编写代码,则应该编写符合 CLS 的代码。” 但据我所知,没有理由在通用软件中使用 CLS 合规性。

我是对的,还是我错过了什么?

【问题讨论】:

标签: c# cls-compliant


【解决方案1】:

如果您编写库或框架,确保您的库可用于任何 CLR 语言是有意义的。

【讨论】:

  • CIL(通用中间语言)不够用?
  • afaik 不,因为 CIL 可能包含某些 CLR 语言无法使用的功能。例如。您有一个采用 UInt32 参数的方法,CIL 代码很好,但无法从没有无符号概念的语言调用该方法。
  • 在 CIL 中“翻译”了语言会发生什么(当然有源代码)?在这种情况下,似乎只有旧程序集才需要符合 CLS,对吧?
  • 不要吹毛求疵,@TonyD,但用谷歌搜索可能比在此处发表评论更容易。 msdn.microsoft.com/en-us/library/…
【解决方案2】:

如果您要分发库,则 CLS 合规性尤其重要 - 具体而言,编写符合 CLS 的代码可确保您的库可用于所有符合 CLS 的语言。

例如,Visual Basic 不区分大小写,而 C# 是。 CLS 合规性的要求之一是公共(和受保护的)成员名称不应仅按大小写不同,从而确保您的库可以由 Visual Basic 代码或任何其他不区分基于案例。

【讨论】:

  • 还有一条规则,成员不能下划线开头。这让我想知道如何命名由公共属性包装的受保护变量......不能使用小写版本,不能使用下划线......下一个丑陋的替代方案是什么?
  • 可能以 p 为前缀。不漂亮,但实用。虽然我更喜欢 C# 属性而不是 Java 风格的 getter 和 setter,但至少在 Java 中命名约定更容易。
  • 不知何故,当一切都说完了,java最终变得更加简洁。不过,我认为这可能更多的是库而不是语言。
  • PowerShell 也是不区分大小写的,这让我一直想知道,当 .NET 类包含仅大小写不同的成员时,它会如何表现
【解决方案3】:

答案是允许跨 .NET 语言的最大兼容性。 CLS 是一种通用语言,它允许 C# 程序集与 F#、Iron Python、C++/CLI、VB.NET、Boo 和所有其他 .NET 语言一起使用。跨出该边界,您的程序集可能会正常工作,但不一定。

【讨论】:

    【解决方案4】:

    可能没有特定理由让您的代码符合 CLS,但人们将其称为“最佳实践”——您应该这样做,因为这是一个好习惯,而不是在特定情况下明显更好。

    换句话说,最好让你的代码符合 CLS,除非你有理由这样做。

    【讨论】:

    • 我觉得很奇怪许多 .NET 库不符合 CLS。所以几乎任何使用这些组件之一的类也不兼容。
    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多