当数组大小大于Int32.MaxValue时,.Length行为与.LongLength有什么区别?

8
我正在寻找有关数组的.Length和.LongLength属性之间差异的文档。具体来说,如果数组长度大于Int32.MaxValue,.Length会抛出异常、返回Int32.MaxValue、变为负数还是返回0?请注意,“可能重复”的问题:我不是在询问数组的最大长度或.NET CLR对象的最大大小。假设一个64位系统和支持大对象的CLR版本。

@HenkHolterman 同意,说得好。缺乏文档让我感到不安,我想写一些符合规范的东西。 - DaveD
2
我建议从你的问题中删除性能部分,这样人们就会更关注你的实际问题。 - harold
为什么不试一下呢? - user4003407
根据文档,这两个属性都是以O(1)的时间复杂度运行的,但我同意Henk的观点,文档对你的其他问题不够清晰。既然你已经澄清了问题,我已经撤回了我的关闭投票并删除了之前的评论。 - GolezTrol
一个大小为int32.maxvalue的int数组将需要8GB的数据。这个数量太大了,无法实现。对于任何实际目的,您都不会分配如此荒谬的内存量。在我看来,出于这个原因,文档没有对这种行为做出评论。 - Raj Kamal
无法创建超过 2,147,483,591 个元素的数组,因此我们永远不会知道(难道我们会吗?)如果我们能够创建一个超过 Int32.MaxValue 元素的数组会发生什么。 - Sergii Zhevzhyk
1个回答

10

无法创建具有超过2,147,483,591个元素的一维数组(相比之下,int.MaxValue是2,147,483,647)。如果尝试创建更多元素的数组,则会抛出OutOfMemoryException异常。这意味着LongLength属性仍然无用,您可以改为使用Length属性

我在使用.NET 4.5的x64平台上进行了测试。为了创建具有2,147,483,591个元素的数组,我修改了配置文件并添加了:

<configuration>
    <runtime>
        <gcAllowVeryLargeObjects enabled="true" />
    </runtime>
</configuration> 

基本上,我使用了这个MSDN页面来启用总大小大于2(GB)的数组。数组的真正限制为:

任何单个维度中的最大索引为2,147,483,591(对于字节数组和单字节结构的数组), 以及2,146,435,071(对于其他类型)。


除了单一维度的限制外,必须存在额外的限制:我可以创建一个6 GB的2维short数组new short[24, 134217728](或更大的结构体),但无法创建byte类型的:new byte[96, 67108864] - springy76

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接