C#数组的数组
首先本文不能算作原创,主要内容来自Eric Lippert的博客:http://blogs.msdn.com/ericlippert/archive/2009/08/17/arrays-of-arrays.aspx
问题:
A. 一个一维数组,其每个元素是个二维数组
B. 一个二维数组,其每个元素是个一维数组
思路一:定义方式
定义一个数组的方式是在类型后面加"[]",所以应该是A
思路二:使用方式
按照A, 假如说这是一个一维数组,那我们获取其一个int值的时候,就要写成
按照B, 如果这是一个二维数组,那我们取值时就可以很自然地写成
思路三:初始化方式
按照A, 应该这么初始化
答案:
正确答案是,这是一个二维数组,其每个元素是个一维数组,也就是B。
解释:
主要是按照思路B,原则是保证定义及使用的一致性。至于思路三,则两个假设都不正确,正确的初始化方式是
Eric在文中写道,他们最初设计语法和编译器时也在考虑这个问题,但最终还是为了保证易于理解和使用而采用了现在的方案。我认为,编译器存在的目的就是让程序员可以不必纠缠于一些底层的细节,而能够专注于逻辑实现,去体现人与机器所不同的地方。因此,这样的实现方式也许在C语言程序员的眼中是很怪异的,但却是必须支持的。
问题:
int[,][] crazy;
定义了一个什么对象?A. 一个一维数组,其每个元素是个二维数组
B. 一个二维数组,其每个元素是个一维数组
思路一:定义方式
定义一个数组的方式是在类型后面加"[]",所以应该是A
思路二:使用方式
按照A, 假如说这是一个一维数组,那我们获取其一个int值的时候,就要写成
crazy[5][2, 3]
这种形式,这就与定义的顺序不相符了,这显然是很怪异的。按照B, 如果这是一个二维数组,那我们取值时就可以很自然地写成
crazy[2, 3][5]
如此看来B又合适一些。思路三:初始化方式
按照A, 应该这么初始化
crazy = new int[,][20];
按照B, 应该这么初始化crazy = new int[][4, 5];
看起来两个都很怪异。答案:
正确答案是,这是一个二维数组,其每个元素是个一维数组,也就是B。
解释:
主要是按照思路B,原则是保证定义及使用的一致性。至于思路三,则两个假设都不正确,正确的初始化方式是
crazy = new int[4, 5][];
也就是说,依然是和定义方式保持一致的。Eric在文中写道,他们最初设计语法和编译器时也在考虑这个问题,但最终还是为了保证易于理解和使用而采用了现在的方案。我认为,编译器存在的目的就是让程序员可以不必纠缠于一些底层的细节,而能够专注于逻辑实现,去体现人与机器所不同的地方。因此,这样的实现方式也许在C语言程序员的眼中是很怪异的,但却是必须支持的。
posted on 2009-09-11 16:25 Gildor Wang 阅读(360) 评论(0) 编辑 收藏 举报