反向C#锯齿形数组类型声明

时间:2012-09-21 14:31:55

标签: c# multidimensional-array jagged-arrays

我刚刚接受了其中一个“什么......”的时刻。以下是否有目的,C#中数组的“非自然”声明背后是否存在一些模糊的推理?

int[,][] i; // declares an 2D - array where each element is an int[] !
// you have to use it like this:
i = new int[2,3][];
i[1,2] = new int[0];

我本来期待相反的方式。 int [,] []声明一个1维数组,其中每个元素都是一个二维数组。

有趣的是,类型名称相反:

Console.WriteLine(typeof(int[,][]).Name); // prints "Int32[][,]"

有人可以解释一下吗?这是故意的吗? (在Windows下使用.NET 4.5。)

2 个答案:

答案 0 :(得分:8)

你可以在Eric Lippert的博客Arrays of arrays中找到一个冗长的讨论。

  

C#实际上做了什么

     

这是一团糟。无论我们选择哪种选项,事情都不会结束   匹配我们的直觉。这是我们在C#中实际选择的内容。

     

首先关闭:选项二[它是一个二维数组,每个元素都是一维的整数数组]是正确的。我们强迫你和他一起生活   后果之一所带来的怪异;你实际上并没有   通过追加数组将元素类型转换为该类型的数组   符。通过在说明符前加上它使它成为一个数组类型   到现有数组说明符的列表。疯狂但真实。

'prepending'这个词部分解释了反转类型名称的输出。 CLR类型名称不一定与C#声明相同。

但更相关的引用是在底部:

  

所有人都说,多维乱七八糟的数组几乎肯定是一个糟糕的代码味道。

答案 1 :(得分:0)

第一次看到new int[5][];而不是new int[][5];时,我有同样的“...... ...”。

EL的(非常好的)博客文章围绕着一件事:对于拥有ComSci学位的人来说,有一个完美的方法,但没有好办法为其他人做这件事。如果你只是按照语法,你从右到左声明,new从右到左,从左到右索引:

// 1D array of 2D arrays, no special rules needed:
int[,][] N; N=new[,][5]; N[0]=new int[4,4];

但是C#的目标受众不是拥有4年CS学位的人(他们都看过反向波兰人并且喜欢从右到左。)诀窍,恕我直言,了解C#锯齿状阵列是他们决定做特别的对他们的规则,当他们在技术上不需要时。