10

我目前正在阅读AlbahariC# 3.0 in a Nutshell和 pg。241,在谈到数组索引时,他说:

基于非零的数组不符合 CLS(通用语言规范)

非零数组不符合CLS究竟是什么意思?它对您的代码有什么影响?

[更新]

是本书页面的链接。

4

4 回答 4

28

CLS(通用语言规范)为一组通用的合规性规则奠定了基础,确保其他语言(VB.NET、F# 等)可以使用您使用 C# 构建的程序集。非零基数组将不兼容,因为其他语言期望数组是从零开始的。

这是一个更容易理解的例子:

class Foo
{
    public void Bar() { }
    public void bar() { } 
}

此类型符合 CLS,因为它包含两个名称仅按类型不同的成员。由于 VB.NET 编译器不区分大小写,因此使用 VB.NET 的人如何区分Bar和?bar

所以基本上 CLS 是一堆这样的规则来保证语言之间的互操作性。

于 2009-06-05T13:07:16.790 回答
12

CLS 合规性主要是为了确保您的代码尽可能广泛地与其他语言兼容。它包括诸如不公开仅区分大小写的公共成员之类的内容(这会使 VB 混淆,它不区分大小写)。有关更多信息,请参阅此MSDN 文章以及公共语言规范本身。

于 2009-06-05T13:07:30.067 回答
2

除了已经说过的内容之外,基于非零的数组的存在只是为了简化现有 VB6 代码(主要通过自动迁移工具)的转换,因为在 VB6 中,数组索引可以从任意数字开始,不一定是零。

由于 CLS 合规性问题(和其他考虑),不建议在 .NET 中使用它们(即使在编程 VB.NET 时)。此外,它们的使用受到相当的限制。通过将数组封装在类中并编写适当的索引访问运算符来进行偏移转换会更容易。

于 2009-06-05T15:12:56.367 回答
0

还,

如果您的应用程序不打算与其他程序一起使用 - 因为它是一个独立的单元,您不会将其作为公共类库出售给其他人,请不要太担心。

但是这里的其他评论在开发泛型类库时是正确的。

It is always good practice to use [assembly:CLSCompliant(true)], but it isn't critical to getting your application running.

于 2009-08-05T17:14:47.587 回答