C#数组的数组

首先本文不能算作原创,主要内容来自Eric Lippert的博客:http://blogs.msdn.com/ericlippert/archive/2009/08/17/arrays-of-arrays.aspx
问题:
int[,][] crazy;
定义了一个什么对象?
A. 一个一维数组,其每个元素是个二维数组
B. 一个二维数组,其每个元素是个一维数组

思路一:定义方式
定义一个数组的方式是在类型后面加"[]",所以应该是A
思路二:使用方式
按照A, 假如说这是一个一维数组,那我们获取其一个int值的时候,就要写成
crazy[5][23]
这种形式,这就与定义的顺序不相符了,这显然是很怪异的。
按照B, 如果这是一个二维数组,那我们取值时就可以很自然地写成
crazy[23][5]
如此看来B又合适一些。
思路三:初始化方式
按照A, 应该这么初始化
crazy = new int[,][20];
按照B, 应该这么初始化
crazy = new int[][45];
看起来两个都很怪异。

答案:
正确答案是,这是一个二维数组,其每个元素是个一维数组,也就是B。

解释:

主要是按照思路B,原则是保证定义及使用的一致性。至于思路三,则两个假设都不正确,正确的初始化方式是
crazy = new int[45][];
也就是说,依然是和定义方式保持一致的。
Eric在文中写道,他们最初设计语法和编译器时也在考虑这个问题,但最终还是为了保证易于理解和使用而采用了现在的方案。我认为,编译器存在的目的就是让程序员可以不必纠缠于一些底层的细节,而能够专注于逻辑实现,去体现人与机器所不同的地方。因此,这样的实现方式也许在C语言程序员的眼中是很怪异的,但却是必须支持的。

posted on 2009-09-11 16:25  Gildor Wang  阅读(360)  评论(0编辑  收藏  举报

导航