在研究CLI的内部时,我注意到类型签名可以指定数组边界(在编译时。)例如,而不是:
Byte[,]
我们可以:
Byte[1...100,1...]
如果我没有弄错,就不可能在C#或C ++ / CLI中实际声明类似后者的类型。此外,ECMA-335表明:
VES为每个可区分的数组类型创建一个数组类型。通常,数组类型仅通过其元素的类型及其等级来区分。
公共语言规范(CLS)规定了许多限制,包括:
只有一个项是数组并且数组的元素类型应该是 需要区分过载。
因此,似乎对CLI的最低级别存在编译时数组边界的支持,但在其他地方则不然。这让我想知道:
在实践中何时会创建/遇到包含此信息的类型签名?是否有做的.NET语言?编辑:有些语言可能做通常使用基于单一的数组 - 但他们是否将其编码为类型签名?
如果 存在,CLI实际上使用这些信息在哪里? (在我设计CLI实现时,我特别感兴趣。)
据我所知,任何数组都是使用向量的newarr
字节码指令创建的,或者对于一般情况使用Array.CreateInstance
。这些机制都不接受数组本身的类型签名,因此创建它似乎无法使用此信息。
理论上,通过内联高效的机器代码来计算地址,此信息可用于优化阵列访问。但是,ldelem
和朋友只能访问简单的向量;多维数组访问需要一个方法调用,这让我觉得这样的优化可能不会发生。
我必须认为这个机制有一些目的,为了使它成为一个国际标准,但我并没有真正看到它。
答案 0 :(得分:1)
此信息仅出现在数组类型的签名中,如果没有访问数组对象成员,则它在运行时不可用。这对于将具有不同边界的数组视为不同类型的语言非常重要,Pascal语言就是一个例子。它将array[1..10] of integer
类型的变量视为不同且与array[1..11] of integer
类型的变量不兼容。