这两种语法有什么区别?
3 回答
第一个是多维数组,第二个是锯齿状数组。您可以查看这个问题以了解两者之间的差异,但这里有一个重要的片段:
多维数组创建了一个很好的线性内存布局,而锯齿状数组意味着几个额外的间接级别。
在锯齿状数组中查找值 jagged[3][6] var jagged = new int[10][5] 的工作方式如下:查找索引 3 处的元素(这是一个数组)并查找索引处的元素6 在该数组中(这是一个值)。在这种情况下,对于每个维度,都有一个额外的查找(这是一种昂贵的内存访问模式)。
多维数组在内存中线性布局,实际值是通过将索引相乘来找到的。但是,给定数组 var mult = new int[10,30],该多维数组的 Length 属性返回元素的总数,即 10 * 30 = 300。
锯齿状数组的 Rank 属性始终为 1,但多维数组可以有任何秩。任何数组的GetLength方法都可以用来获取每个维度的长度。对于本例中的多维数组,mult.GetLength(1) 返回 30。
索引多维数组更快,例如在本例中给定多维数组 mult[1,7] = 30 * 1 + 7 = 37,获取索引 37 处的元素。这是一种更好的内存访问模式,因为只有一个内存位置是涉及到,也就是数组的基地址。
因此,多维数组分配一个连续的内存块,而锯齿状数组不必是方形的。例如 jagged 1 .Length 不必等于 jagged[2].Length ,这对于任何多维数组都是正确的。
更新:
multi 和 jagged 数组之间的一个主要区别是 multi 必须始终是“正方形”,这意味着任何两个索引在其子数组中将具有相同数量的元素。锯齿状阵列没有这个要求。看看下面的代码:
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"
前者是一个二维数组。后者是一个数组,其元素也是数组。
第一个是多维数组
第二个是数组数组