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

问题描述 投票:7回答:2

我刚才有一个“什么......”的时刻。以下是否有意,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 [,] []声明一维数组,其中每个元素都是二维数组。

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

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

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

c# multidimensional-array jagged-arrays
2个回答
8
投票

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

C#实际上做了什么

一团糟。无论我们选择哪种选项,最终都不符合我们的直觉。这是我们在C#中实际选择的内容。

首先关闭:选项二[它是一个二维数组,每个元素是一维的一维数组]是正确的。我们强迫你忍受Consequence One所带来的怪异;您实际上并没有通过附加数组说明符将元素类型转换为该类型的数组。通过将说明符前置到现有数组说明符列表中,可以使其成为数组类型。疯狂但真实。

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

但更相关的报价在底部:

总而言之,多维乱七八糟的数组几乎肯定是一个糟糕的代码味道。


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#锯齿状阵列的诀窍在于他们决定为他们制定特殊规则,当他们在技术上不需要时。

© www.soinside.com 2019 - 2024. All rights reserved.