这是一个纯粹的理论问题,所以请不要在答案中警告我。
如果我没有弄错,并且因为.NET中的每个数组都被Int32
索引,这意味着索引的范围从0
到Int32.MaxValue
。
假设不涉及内存/ GC约束 .NET中的数组最多可包含2147483648
(而非2147483647
)元素。正确?
答案 0 :(得分:8)
嗯,理论这是真的。实际上,理论上可以支持更大的数组 - 请参阅此Array.CreateInstance
签名,该签名的长度为long
。您无法使用C#索引器索引此类数组,但您可以使用GetValue(long)
。
但是,在实用术语中,我不相信任何实现都支持如此庞大的数组。 CLR的每个对象限制有点短于2GB,因此即使是字节数组,实际上 也有2147483648个元素。一些实验表明,在我的盒子上,你可以创建的最大数组是new byte[2147483591]
。 (那是在64位.NET CLR上; Mono I的版本已经安装了choke。)
编辑:只是查看CLI规范,它指定数组具有Int32的下限和上限。这意味着即使可以用Int32.MaxValue
调用表达,Array.CreateInstance
的上限也是禁止的。但是,它也意味着允许一个带有边界Int32.MinValue...Int.MaxValue
的数组,即总共4294967296个元素。
编辑:再看一遍,ECMA 335分区III第4.20节(newarr
)指定初始化带有newarr
的向量类型必须采用native int
}或int32
值。所以它看起来像通常更宽松的阵列" CLI术语中的类型必须有int32
边界,"向量"类型没有。