.NET的旗舰语言包括不符合CLS的编程结构,这似乎很奇怪。那是为什么?
示例(来自here):两个或多个仅使用大小写差异定义的公共/受保护/受保护内部成员
public int intA = 0;
public int INTA = 2;
或
public int x = 0;
public void X()
{
}
答案 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标准基本上做了三件事:
当像vb.net或C#这样的语言允许创建非CLS兼容编程时,这意味着微软认为某些功能足以证明包含在这些语言中是合理的,但不是那么精彩或没有争议的理由强制要求所有语言包括它们。