我目前正在阅读 Albahari 的C# 3.0 in a Nutshell和pg。 241,在谈论数组索引时,他说:
非基于非零的数组不是 CLS(通用语言规范) - 兼容
对于非零阵列不能符合CLS ,这究竟意味着什么?它对你的代码有什么影响?
[更新]
Here是指向该书页面的链接。
答案 0 :(得分:27)
CLS(公共语言规范)为一组通用规则奠定了基础,这些规则保证其他语言(VB.NET,F#等)可以使用您使用C#构建的程序集。基于非零的数组不符合要求,因为其他语言希望数组从零开始。
以下是一个更容易理解的示例:
class Foo
{
public void Bar() { }
public void bar() { }
}
此类型不符合CLS,因为它包含两个仅按类型名称不同的成员。使用VB.NET的人如何在Bar
和bar
之间消除歧义,因为VB.NET编译器不区分大小写?
所以基本上CLS是一堆这样的规则来保证语言之间的互操作性。
答案 1 :(得分:12)
CLS合规主要是为了确保您的代码与其他语言尽可能广泛兼容。它包括不公开公共成员的事情,这些公共成员只有大小写(这会混淆VB,这是不区分大小写的)。有关详细信息,请参阅此MSDN article以及common language specification本身。
答案 2 :(得分:2)
除了上述内容之外,基于非零的数组仅用于简化现有VB6代码的转换(主要通过自动迁移工具),因为在VB6中,数组索引可以从任意数字开始,不一定是零。
由于CLS合规性问题(以及其他注意事项),不建议在.NET中使用它们(即使在编写VB.NET时也是如此)。此外,它们的使用受到相当的限制。通过将数组封装在类中并编写适当的索引访问操作符来进行偏移量转换更容易。
答案 3 :(得分:0)
此外,
如果您的应用程序无意与其他程序一起使用 - 因为它是一个独立的单元,您不会将其作为公共类库出售给其他人,请不要过于担心。
但是在开发通用类库时,其他注释是正确的。
使用[assembly:CLSCompliant(true)]总是好的做法,但是让应用程序运行并不重要。