C# 数组大小大于Int32.MaxValue时.Length行为与LongLength

C# 数组大小大于Int32.MaxValue时.Length行为与LongLength,c#,arrays,C#,Arrays,我正在寻找一些关于数组的.Length和.longlegth属性之间差异的文档 具体来说,如果数组的长度大于Int32.MaxValue,那么.length是否会引发异常,返回Int32.MaxValue,返回负值,返回0 (为了消除“可能重复”的顾虑:我不是在询问数组的最大长度或.NET CLR对象的最大大小。假设使用64位系统和支持大型对象的CLR版本)不可能创建包含2147483591个元素以上的一维数组(用于比较,int.MaxValue为2147483647)。OutOfMemoryE

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

具体来说,如果数组的长度大于Int32.MaxValue,那么.length是否会引发异常,返回Int32.MaxValue,返回负值,返回0


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

不可能创建包含2147483591个元素以上的一维数组(用于比较,
int.MaxValue
为2147483647)。
OutOfMemoryException
是在试图创建包含更多元素的数组时抛出的。这意味着
LongLength
属性仍然无效,您可以使用
Length
属性

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

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

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

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


@HenkHolterman同意,这是一个很好的观点。缺乏文档只是让我感到不安,我想写一些符合规范的东西。OP我建议从你的问题中删除性能部分,人们会关注它,而不是你的实际问题。为什么不试试呢?这两个属性都在O(1)中运行根据文档,但我同意Henk的观点,即文档对您的其他问题不清楚。既然您也澄清了您的问题,我就撤回了我的反对票,并删除了以前的评论。有可能吗?大小为int32.maxvalue的int数组将需要8GB的数据。这个数量太大了,无法实现。对于任何实践而言出于这个目的,您永远不会分配如此荒谬的内存量。在我看来,文档没有对这种行为发表任何评论。除了一维限制之外,还必须存在其他限制:我可以创建一个6 GB的2-dim短数组
新的短[24134217728]
(或更大的结构)但不是字节:
新字节[9667108864]