这两种语法有什么不同?
多维数组创建了一个漂亮的线性内存布局,而交错数组意味着几个额外的间接级别。
在交错数组var jagged = new int[10][5]中查找jagged [3] [6]的值的方法如下:查找索引为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,这对于任何多维数组都是正确的。
更新:
多和交错数组之间的一个主要区别是,多必须始终是“方形”,这意味着任何两个索引在其子数组中具有相同数量的元素。交错数组没有此要求。请查看下面的代码:
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"