【发布时间】:2012-08-08 01:34:45
【问题描述】:
这两种语法有什么区别?
【问题讨论】:
这两种语法有什么区别?
【问题讨论】:
第一个是多维数组,第二个是锯齿状数组。您可以查看this question 以了解两者之间的差异,但这里有一个重要的片段:
一个多维数组创建了一个很好的线性内存布局,而一个 锯齿状数组意味着几个额外的间接级别。
在锯齿状数组中查找值 jagged[3][6] var jagged = new int[10][5] 的工作方式如下:查找索引 3 处的元素(即 一个数组)并在该数组中查找索引 6 处的元素(这是一个 价值)。在这种情况下,对于每个维度,都有一个额外的查找 (这是一种昂贵的内存访问模式)。
一个多维数组在内存中线性布局,实际 通过将索引相乘来找到值。然而,鉴于 array 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 处的元素。这是更好的内存访问 模式,因为只涉及一个内存位置,即 数组的基地址。
因此,一个多维数组分配一个连续的内存 块,而锯齿状数组不必是方形的。例如 jagged1.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"
【讨论】:
前者是一个二维数组。后者是一个数组,其元素也是数组。
【讨论】:
第一个是多维数组
第二个是数组数组
【讨论】: