这两种语法有什么区别?
答案 0 :(得分:8)
第一个是多维数组,第二个是锯齿状数组。你可以看看this question来描述两者之间的差异,但这里有一个重要的信息:
多维数组创建一个漂亮的线性内存布局,而a 锯齿状数组意味着几个额外的间接层。
在锯齿状数组var jagged = new中查找锯齿状[3] [6]的值 int [10] [5]的工作原理如下:在索引3处查找元素(即 一个数组)并查找该数组中索引6处的元素(这是一个 值)。对于这种情况下的每个维度,还有一个额外的查找 (这是一种昂贵的内存访问模式)。
多维数组在内存中线性排列,实际上 通过将索引相乘来找到值。但是,考虑到了 array var mult = new int [10,30]的Length属性 多维数组返回元素总数,即10 * 30 = 300。
锯齿状数组的Rank属性始终为1,但是a 多维数组可以有任何排名。任何GetLength方法 数组可用于获取每个维度的长度。为了 此示例中的多维数组mult.GetLength(1)返回30。
索引多维数组的速度更快,例如鉴于 此示例中的多维数组mult [1,7] = 30 * 1 + 7 = 37, 获取该索引的元素37.这是一个更好的内存访问 模式,因为只涉及一个内存位置,这是 数组的基址。
因此,多维数组会分配连续的内存 块,而锯齿状阵列不必像方块一样。例如 锯齿状的1。长度不等于锯齿状[2]。长度可以 适用于任何多维数组。
更新
multi和jagged数组之间的一个主要区别是multi必须始终为“square”,这意味着任何两个索引在其子数组中将具有相同数量的元素。锯齿状阵列没有此要求。看看下面的代码:
var jagged = new int[3][]; //not defining the size of the child array...
var multi = new int[3,8]; //defining a 3x8 "square"
var multiBad = new int[3,]; //Syntax error!
var jaggedSquare= new int[3][8]; //another 3x8 "square"
答案 1 :(得分:2)
前者是二维数组。后者是一个数组,其元素也是数组。
答案 2 :(得分:2)
第一个是多维数组
第二个是数组数组