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