写为名称[x,y]而不是名称[x] [y]的数组

时间:2012-08-10 18:01:31

标签: c# .net arrays

这两种语法有什么区别?

3 个答案:

答案 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)

第一个是多维数组

第二个是数组数组