为什么C#包含不符合CLS的编程结构?

时间:2011-02-16 21:24:59

标签: c# .net cls-compliant

.NET的旗舰语言包括不符合CLS的编程结构,这似乎很奇怪。那是为什么?

示例(来自here):两个或多个仅使用大小写差异定义的公共/受保护/受保护内部成员

public int intA = 0;
public int INTA = 2; 

public int x = 0;

public void X()
{
} 

7 个答案:

答案 0 :(得分:16)

即使是无符号整数也不符合(至少在公共API上),但它们对于进行位移的人非常重要,特别是在右移时(有符号和无符号有不同的右移行为)

他们最终会让你在适当的时候自由使用 。区分大小的我可以减少宗教信仰 - 尽管方便有一个字段和属性只有个案差异,我想我可以幸福地生活在被迫使用不同的名字!特别是现在我们已经自动实现了属性......

这类似于它允许你使用unsafe的方式 - 这里的区别在于一些无符号整数不会破坏整个运行时的稳定性,所以它们不需要那么强大的molly-guard。

您可以添加:

[assembly: CLSCompliant(true)]

如果您愿意,编译器会告诉您何时出错。

最后:大多数代码(按卷)不作为组件使用。它是为了完成一项工作而编写的,并且可能由内部的其他代码使用。主要是图书馆编写者/供应商需要担心CLS合规性等问题。这是(按数字)少数。

答案 1 :(得分:14)

这不是CLS合规性的工作原理。这是你的负担。 C#并没有限制自己严格的合规性,这会使它成为一种表达能力差的语言。将所有.NET语言拖动到最低公分母将很快杀死该平台作为可行的编程环境。

由您来确保程序集中公开可见类型符合CLS合规性。确保班级成员不会因案例而异,这很简单。让编译器通过使用[assembly:CLSCompliant(true)]属性帮助你,编译器会在你滑倒时发出警告。

答案 2 :(得分:4)

请参阅http://msdn.microsoft.com/en-us/library/bhc3fa7f.aspx

CLS是一个选择加入的规范。从上面引用:

当您设计自己的符合CLS的组件时,使用符合CLS的工具会很有帮助。在没有此支持的情况下编写符合CLS的组件更加困难,否则您可能无法访问要使用的所有CLS功能。

某些符合CLS的语言编译器(如C#或Visual Basic编译器)使您能够指定您希望代码符合CLS。这些编译器可以检查CLS合规性,并在您的代码使用CLS不支持的功能时通知您。 C#和Visual Basic编译器允许您将程序元素标记为符合CLS,如果代码不符合CLS,将导致编译器生成编译时错误。例如,以下代码生成编译器警告。


以上链接的示例代码:

using System;

// Assembly marked as compliant.
[assembly: CLSCompliant(true)]

// Class marked as compliant.
[CLSCompliant(true)]
public class MyCompliantClass {
   // ChangeValue exposes UInt32, which is not in CLS.
   // A compile-time warning results.
   public void ChangeValue(UInt32 value){ }

   public static void Main( ) {
   int i = 2;
   Console.WriteLine(i);
   }
}

此代码生成以下C#警告:

复制警告CS3001:参数类型'uint'不符合CLS

答案 3 :(得分:3)

关于CLS合规性的两分钱

.net语言是在创建时存在的所有语言的演变。这些语言是精心设计的,因此您可以轻松地将基础项目转换为.Net项目,而无需太多的开发工作。由于语言之间存在巨大差异,因此语言需要采用某种约定来相互交流。以下面的语言示例:

VB.Net是一种源自早期语言VB6的语言。它假设在样式上与VB6非常相似,因此需要很多VB6使用的约定。由于VB6很容易被非开发人员学习/使用,因此它具有某些特性,使其更具有白痴性。动态类型,不区分大小写是这两件事。

C#.Net / C ++ .Net是程序员友好的C ++的衍生物。由于它们是这种语言的演变,因此它具有C ++可以让你做的事情。区分大小写,静态类型等。

现在,面对两种不同的语言,他们想要实现互操作性微软做了唯一合理的事情。他们通过使用基本的软件合同限制了两种语言如何相互作用。由于语言的不同,此代码只能以这种方式使用。

例如,使用VB.Net代码调用C#代码 如果C#代码有两个函数只有大小写,X()vs x(),VB.net将永远无法正确调用此代码,因为它不区分大小写。 CLS合规必须使其成为非法行为。如果你看看其他规则,他们基本上对不同语言之间的其他语言功能做同样的事情。

答案 4 :(得分:2)

我猜测不区分大小写仅包含在CLS合规性中,因此VB.NET可能符合CLS。根据我的理解,如果某个特定的语言结构不符合CLS,则不会出现问题,除非您使用它的方式使得代码的公共API中存在不合规的语言。

Microsoft的提示似乎是CLS合规性仅在您从不同语言访问的代码中很重要(例如从VB.NET项目引用C#程序集)。

答案 5 :(得分:1)

我认为微软希望为开发者提供自由。没有限制,如果没有必要。 C#不受CLS的限制,因为不是每个人都需要与VB的互操作性。

答案 6 :(得分:0)

如果对编程语言中应包含哪些功能达成普遍一致意见,那么世界只需要一种编程语言(其中包括每个人都同意的那些功能)。当然,实际上有些人会认为其他人不关心的重要特征(甚至是令人反感的)。 CLS标准基本上做了三件事:

  1. 它说某些功能非常重要,任何不包含它们的语言都应该被认为不适合通用的.net编程。
  2. 它说程序员的库不需要除列出的那些之外的任何功能,应该期望程序员可以使用适合于通用.net编程的任何语言来使用它们的库。
  3. 它告诉程序员,如果他们的库的某些部分需要使用不需要支持的语言的功能,那些部分可能无法用于适合.net编程的语言,但是不能包括所需的功能。

当像vb.net或C#这样的语言允许创建非CLS兼容编程时,这意味着微软认为某些功能足以证明包含在这些语言中是合理的,但不是那么精彩或没有争议的理由强制要求所有语言包括它们。