繁体   English   中英

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

[英]C# jagged array type declaration in reverse

我刚才有一个“什么......”的时刻。 以下是否有意,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。)

你可以在Eric Lippert的博客数组中找到一个冗长的讨论。

C#实际上做了什么

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

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

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

但更相关的报价在底部:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM