我刚刚接受了其中一个“什么......”的时刻。以下是否有目的,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。)
答案 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#锯齿状阵列是他们决定做特别的对他们的规则,当他们在技术上不需要时。