数组中元素的确切最大限制是多少

时间:2011-03-20 07:47:20

标签: c# arrays

这是一个纯粹的理论问题,所以请不要在答案中警告我。

如果我没有弄错,并且因为.NET中的每个数组都被Int32索引,这意味着索引的范围从0Int32.MaxValue

假设不涉及内存/ GC约束 .NET中的数组最多可包含2147483648(而非2147483647)元素。正确?

1 个答案:

答案 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边界,"向量"类型没有。