在数据结构算法,以及科学计算中,数组是必不可少的工具。习惯了C中简单直接的数组表达方式的程序员,初次使用C#中的数组时,可能会有一些茫然。本文采用对比的方式来学习C#数组的使用方式。本文不介绍那些语法糖的东西,尽管语法糖有时候能大大地简化代码。
C 语言中一维数组实例代码如下:
#include <stdio.h> int main(int argc, char** argv) { int a[10]; int i = 0; for(i=0; i<=10; i++) //当i=10时,数组越界 { a[i] = i; } }
总结特点: (1)索引从0开始;(2)越界不会引发错误;(3)数组默认存放到栈内存中;(4)声明时必须制定长度;
C#中同样功能的代码如下:
class Test
{ static void Main() { int[] a; a = new int[10]; for (int i = 0; i <= 10; i++) //i=10时,会抛出异常 { a[i] = i; } } }
上述代码编译时通过,运行时发生异常。
总结特点:(1)索引从0开始;(2)越界运行时会产生异常;(3)数组本身是对象,所以存放到堆内存中;(4)声明语法与C有差异;(5)创建对象而不是声明时指定长度;
多维数组在C和C#中的语法格式差别较大。以二维数组为例。先看C的:
#include <stdio.h> int main(int argc, char** argv) { int a[3][2]; int i,j; for(i=0; i<3; i++) { for(j=0; j<2; j++) { a[i][j] = 0; } } }
再看C#的:
class IntroToLINQ { static void Main() { int[,] a = new int[3, 2]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { a[i,j] = 0; } } } }
注意,二维数组的索引语法发生了重大改变,在C#中不再是[i][j],而是[i,j]。这是因为[i][j]在C#被解释成数组的数组,而不是二维数组。除此之外就没差异了。
在C语言中不直接支持这种类型的数组。数组的数组也就是数组的嵌套,本质上是一维数组,其实是很好理解的。对于一维数组而言,如果数组的元素本身还是个数组,那么这就是数组的数组了。
当然这个概念可以无限层级的嵌套,数组的数组的数组的数组。。。。
C#代码:
class IntroToLINQ { static void Main() { int[][] a = new int[2][]; a[0] = new int[10]; a[1] = new int[3]; } }
可以这样理解这种int[][]语法格式,其中的int表示最低层数组的元素的数据类型为int型。然后按照从前往后的顺序,第一个[]表示这是一个数组,第二个[]表示前面数组的元素的数据类型是数组,遇到;结束,表示这个[]是最后一个,其元素的数据类型就是前面的int。因为本质上数组的数组就是一维数组,所以创建的时候要制定一维数组的长度。
下面比较同样功能的多维数组和数组的数组:
class IntroToLINQ { static void Main() { //多维数组 int[,] a = new int[3, 2]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { a[i, j] = 0; } } //数组的数组 int[][] b = new int[3][]; b[0] = new int[2]; b[1] = new int[2]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { b[i][j] = 0; } } }
可以看出,使用数组的数组较为繁琐,好处是每个子数组的长度可以不同,本例则都设为2了。在数据计算中,这种需求比较少,所以能用多维数组的地方,尽量别使用数组的数组。