在C#中,数组的最大维度是多少,例如a[1][1][1][1]....[1]?

8
我刚看到了这个问题(链接),并试图回答它。但是在回答的过程中,我想知道C#的答案是什么?我正在寻找一些MSDN文档或类似于Java的任何相关来源。

C#中允许的数组最大维数是多少,例如a[1][1][1][1]....[1]。我尝试在SO上搜索,但没有找到答案。

我能找到的最好答案是"理论上,一个数组最多可以有2,147,483,647个元素,因为它使用int进行索引。"

此外,我知道数组可以容纳的最大大小是

System.Int32.MaxValue

如果这是一个重复的问题,请告诉我,我会删除我的问题。


还有另一个问题,你正在询问数组中元素的限制,而你所引用的问题则问一个数组可以拥有的最大维数。 - Bob Vale
@BobVale:- 是的,我在问同样的问题,但是用C#语言。 - user3414693
@Steve:我认为这与你链接的那个不同。我知道限制是什么,我想问的是尺寸? - user3414693
顺便问一下,你为什么想要这个问题的答案?你是在尝试做某些特定的事情吗?你几乎总是要避免使用多维数组。你也可以设计一个没有维数限制的简单数据结构。 - GregRos
1
@GregRos:- 是的,我完全同意并且我也知道那个问题。正如我在我的问题中提到的,我只是好奇地在C#中问了这个问题,因为我之前在Java中看到过它 :) - user3414693
哦,抱歉。我没注意到那个。 - GregRos
1个回答

21

限制为32。我用代码检查了它:

var b = Array.CreateInstance(typeof (int), new int[32]);
var a = Array.CreateInstance(typeof (int), new int[33]);

这适用于针对64位和32位的应用程序。

实际上,我不需要通过谷歌来获得答案。直接来自MSDN:

元素是数组中的值。 数组的长度是它可以包含的元素总数。 数组的等级是数组中的维数数量。 数组维度的下限是该数组的该维度的起始索引;多维数组可以具有每个维度的不同边界。 数组最多可以有32个维度。

关于锯齿数组

然而,我刚刚注意到你在编辑中使用了语法(并且Peter在下面的评论中也使用了相同的语法),这不是C#中定义多维数组的方式。多维数组的定义方式如下:

int[,,,] arr = new int[0,0,0];

它们是由常规整数组成的数组,恰好具有多个维度。语法:

int[][][] = new int[0][][];

定义了在C#中被称为交错数组的东西。交错数组只是常规的单维数组,其元素恰好是其他数组。正如MSDN文章所指出的那样,你可以有交错数组的多维数组,或者反过来。

然而,它们被以不同的方式处理。交错数组只是(实际上)常规对象的数组,并且因此没有像多维数组一样受到限制。交错数组的“维数”理论上没有限制,事实上CLR很高兴地让我运行了以下代码:

Array arr = new int[0];
for (int i = 0; i < Int32.MaxValue - 1; i++) {
    var newArr = Array.CreateInstance(arr.GetType(), 1);
    newArr.SetValue(arr, 0);
    arr = newArr;
}

直到我的系统完全无响应并崩溃。没有抛出任何异常。

将循环限制为1000次迭代,您会发现结果数组的类型是:

System.Int32[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]...

此外,尽管我找不到相关的来源,但是一个锯齿状数组可以有的维数可能甚至不受单个对象内存限制的限制,因为每个数组只有对对象的引用。例如,具有嵌套因子为1000且每个数组有2个元素的(最终)Int32锯齿状数组将占用可忽略的内存量(也就是说,它本身),但所有数组组合起来将占用指数级的内存。

* 通过一些语法糖。编码锯齿状数组的更加语法上正确的方式是:int[][] arr = new int[][0];,因为 int[] 是元素类型。

这是实现定义

数组可以有的维数似乎是实现定义的。该数字在 CLI 规范中似乎不存在,并且由 Peter 提供的代码在 Ideone 的 mono-2.8 上运行良好,在那里似乎限制为 255。


我糊涂了,我没有看到备注部分!:( - user3414693
1
如果这是真的,有人能解释一下为什么我可以在这里创建一个具有50个维度的数组吗:http://ideone.com/Bh59zd - heijp06
2
你关于锯齿数组的说法是正确的。事实证明,我甚至可以在ideone.com上创建具有超过32个维度的多维数组,例如:http://ideone.com/JCo2bV。看起来ideone运行在Mono上,而Mono在创建多维数组时具有255个维度的上限。最大维数似乎是实现特定的,我找不到语言规范中定义的最大值。 - heijp06
3
对于 [][][][][][]... 的恐怖和实际运行直到崩溃的经历,点个赞。 - Tim S.
1
@PetervanderHeijden 这很有趣。我也没有在CLI规范中找到最大值(不确定你是否指的是那个)。我会编辑我的答案以反映这些信息。 - GregRos
显示剩余2条评论

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