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

Mig*_*uel 0 c# arrays

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

如果我没有记错的话,由于在.NET每一个阵列由一个索引Int32,这意味着指数从范围0Int32.MaxValue.

假设不涉及内存/ GC约束,.NET中的数组可以包含最多2147483648(而不是2147483647)元素.对?

Jon*_*eet 8

那么,理论上这是真的.实际上,理论上可以支持更大的数组 - 请参阅此Array.CreateInstance签名,该签名采用long长度值.您将无法使用C#索引器索引此类数组,但您可以使用GetValue(long).

但是,实际上,我认为任何实现都不支持这样庞大的数组.CLR的每个对象限制有点短于2GB,因此即使是字节数组也不能实际具有2147483648个元素.一些实验表明,在我的盒子上,你可以创建的最大阵列是new byte[2147483591].(这是在64位.NET CLR上; Mono的版本已经安装了choke.)

编辑:只是查看CLI规范,它指定数组具有Int32的下限和上限.Int32.MaxValue即使可以用Array.CreateInstance通话表达,也意味着禁止上限.但是,它意味着允许带有边界的数组Int32.MinValue...Int.MaxValue,即总共4294967296个元素.

编辑:再看,ECMA 335分区III部分4.20(newarr)指定初始化一个矢量类型newarr必须带一个native intint32值.所以看起来虽然CLI术语中通常更宽松的"数组"类型必须有int32边界,但"矢量"类型却没有.