C#中的最大数组维数如 …

我刚刚看到这个问题,并试图回答它。 但在回答时我认为在C#的情况下可能是什么答案? 我正在寻找一些MSDN文档或Java中的任何相关来源

C#中数组允许的最大尺寸是什么,如a[1][1][1][1]....[1] 。 我试图搜索SO,但无法找到。

我得到的最好的结果是“理论上,一个数组最多可以包含2,147,483,647个元素,因为它使用了一个int来进行索引。”

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

System.Int32.MaxValue

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

限制是32.我在这里找到了答案,并且(使用谷歌)用代码检查了它:

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

它适用于64位和32位目标应用程序。

实际上,我不需要谷歌搜索它。 直接来自MSDN :

元素是Array中的值。 数组的长度是它可以包含的元素总数。 数组的等级是数组中的维数。 数组维度的下限是数组维度的起始索引; 多维数组可以为每个维度设置不同的边界。 一个数组最多可以有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[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]... 

另外,虽然我找不到这个的来源,但是锯齿状数组可能具有的维数可能甚至不受单个对象内存限制的限制,因为每个数组只有对象的引用。 例如,一个(最终) Int32的锯齿状数组,其嵌套因子,例如每个数组1000和2个元素,将占用可忽略不计的内存量(即,单独使用),但所有组合的数组都需要达到指数。

*带一点点语法糖。 编码锯齿状数组的语法更正确的方法是: int[][] arr = new int[][0]; 因为int[]是元素类型。

它的实现已定义

数组可以具有的维数似乎是实现定义的。 这个数字没有出现在CLI规范中的任何地方,并且下面提供的代码在Ideone的mono-2.8上运行良好,其中出现限制为255。