当数组大小大于Int32.MaxValue时,.Length行为与.LongLength

本文关键字:Length LongLength MaxValue 数组 小大 大于 Int32 | 更新日期: 2023-09-27 18:27:43

我正在寻找一些关于数组的.Length和.LongLength属性之间差异的文档。

具体来说,如果数组的长度大于Int32.MaxValue,将.length抛出异常,返回Int32.MaxValue,为负数,返回0?

(为了消除"可能重复"的问题:我不是在问数组的最大长度或.NET CLR对象的最大大小。假设是64位系统和支持大型对象的CLR版本)

当数组大小大于Int32.MaxValue时,.Length行为与.LongLength

不可能创建元素数超过2147483591的一维数组(相比之下,int.MaxValue为2147483647)。如果试图创建一个包含更多元素的数组,则抛出OutOfMemoryException。这意味着LongLength属性仍然无用,您可以使用Length属性

我已经使用.NET 4.5在x64平台上进行了测试。为了创建包含2147483591个元素的阵列,我修改了配置文件并添加了:

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

基本上,我使用这个MSDN页面来启用总大小大于2(GB)的阵列。阵列的实际限制:

任何单个维度中的最大索引为2147483591(0x7FFFFFC7),用于字节阵列和单字节结构的阵列,以及2146435071(0X7FEFFFFF)用于其他类型。