9

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

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

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

或者

public int x = 0;

public void X()
{
} 
4

7 回答 7

17

即使是无符号整数也不兼容(至少在公共 API 上),但它们对于进行位移的人来说非常重要,尤其是在右移时(有符号和无符号具有不同的右移行为)。

它们最终可以让您在适当的时候自由使用它们。区分大小写的我可以不那么虔诚 - 尽管一个字段和属性仅因大小写而异,但我认为我可以在被迫使用不同的名称的情况下过上幸福的生活!尤其是现在我们已经自动实现了属性......

这类似于它让您使用unsafe的方式 - 这里的区别在于一些无符号整数不会破坏整个运行时的稳定性,因此它们不需要强大的 molly-guards。

你可以加:

[assembly: CLSCompliant(true)]

如果你愿意,编译器会在你出错时告诉你。

最后:大多数代码(按数量)不作为组件使用。它是为完成一项工作而编写的,并且可能被内部的其他代码使用。主要是图书馆作者/供应商需要担心诸如 CLS 合规性之类的事情。那是(按数字)少数。

于 2011-02-16T21:38:24.563 回答
14

这不是 CLS 合规性的工作方式。这是你的负担。C# 本身并没有限制自己严格遵守,这将使其成为一种表达能力较差的语言。将所有 .NET 语言拖到最低的公分母上将很快扼杀该平台作为可行的编程环境。

您可以确保程序集中的公开可见类型符合 CLS 合规性。确保类成员不会仅因大小写而异,这很容易做到。让编译器通过使用 [assembly:CLSCompliant(true)] 属性来帮助您,当您滑倒时编译器会警告您。

于 2011-02-16T21:41:06.243 回答
5

请参阅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

于 2011-02-16T21:42:10.627 回答
3

我关于 CLS 合规性的两分钱

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

VB.Net 是一种源自早期语言 VB6 的语言。假设它在风格上与 VB6 非常相似,因此采用了很多 VB6 使用的约定。由于 VB6 被认为很容易被非开发人员学习/使用,因此它具有某些特性,使其更加防白痴。动态类型,不区分大小写是其中的两个。

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

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

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

于 2011-02-16T22:08:43.510 回答
2

我猜想不区分大小写只包含在 CLS 合规性中,因此 VB.NET 可以符合 CLS。据我了解,如果特定语言构造不符合 CLS,则没有问题,除非您以这样一种方式使用它,即在代码的公共 API 中可以使用不符合要求的部分。

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

于 2011-02-16T21:29:32.067 回答
1

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

于 2011-02-16T21:39:20.877 回答
0

如果就编程语言中应该包含哪些特性达成普遍共识,那么世界将只需要一种编程语言(这将包括每个人都同意应该存在的那些特性)。当然,在现实中,有些人会认为其他人不关心的重要特征(甚至觉得反感)。CLS 标准本质上做了三件事:

  1. 它说某些特性非常重要,以至于任何不包含它们的语言都应该被认为不适合通用.net 编程。
  2. 它表示,其库不需要除所列功能之外的任何功能的程序员应该期望他们的库可供使用任何适合通用 .net 编程的语言的程序员使用。
  3. 它告知程序员,如果他们的库的某些部分需要使用不需要语言支持的功能,那么这些部分可能无法在适合 .net 编程但不包含所需功能的语言中使用。

当像 vb.net 或 C# 这样的语言允许创建不符合 CLS 的编程时,这意味着 Microsoft 认为某些功能足够有用,可以证明包含在这些语言中是合理的,但没有那么美妙或没有争议,可以证明强制所有语言是合理的包括他们。

于 2012-11-14T22:58:42.020 回答