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

ric*_*ard 8 .net c# cls-compliant

看起来奇怪的是,.NET的旗舰语言将包括不符合CLS的编程结构.这是为什么?

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

public int intA = 0;
public int INTA = 2; 
Run Code Online (Sandbox Code Playgroud)

要么

public int x = 0;

public void X()
{
} 
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 16

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

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

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

你可以加:

[assembly: CLSCompliant(true)]
Run Code Online (Sandbox Code Playgroud)

如果你愿意,编译器会在你弄错的时候告诉你.

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


Han*_*ant 14

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

您可以确保程序集中公开可见的类型符合CLS合规性.确保班级成员不会因案例而异,这很简单.让编译器帮你出使用[大会:CLSCompliant(真)]属性,编译器会警告你,当你滑倒.


rsk*_*kar 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);
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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