数组可以是一维或者多维的。"矩形"数组和"不整齐"数组C#都支持。

一维数组是最常见的类型了。例子:
 1 using System;
 2 class Test
 3 {
 4 static void Main() {
 5 int[] arr = new int[5];
 6 for (int i = 0; i < arr.Length; i++)
 7 arr[i] = i * i;
 8 for (int i = 0; i < arr.Length; i++)
 9 Console.WriteLine("arr[{0}] = {1}", i, arr[i]);
10 }
11 }

创建了一个int型的一维数组,初始化数组的元素后,打印出每个元素的值。输出是:
arr[0] = 0
arr[1] = 1
arr[2] = 4
arr[3] = 9
arr[4] = 16
例子中的类型int[]是一个数组类型。数组类型用一个非数组类型后跟一个或多个秩符号(译注:即方括号"[]")表示。例子:
 1 class Test
 2 {
 3 static void Main() {
 4 int[] a1; // single-dimensional array of int
 5 int[,] a2; // 2-dimensional array of int
 6 int[,,] a3; // 3-dimensional array of int
 7 int[][] j2; // "jagged" array: array of (array of int)
 8 int[][][] j3; // array of (array of (array of int))
 9 }
10 }

展示了各种int型数组的局部变量的声明。数组类型是引用类型,因此数组变量的声明只是为指向数组的引用开辟内存空间。数组实例实际上是由数组的构造函数或者数组构造表达式来创建的。
例子:
 1 class Test
 2 {
 3 static void Main() {
 4 int[] a1 = new int[] {123};
 5 int[,] a2 = new int[,] {{123}, {456}};
 6 int[,,] a3 = new int[102030];
 7 int[][] j2 = new int[3][];
 8 j2[0= new int[] {123};
 9 j2[1= new int[] {123456};
10 j2[2= new int[] {123456789};
11 }
12 }

展示了各种数组构造的表达式。变量a1,a2,a3是矩形数组,j2是不整齐数组。"矩形数组"、"不整齐数组"的说法是基于数组的形状来说的。矩形数组总是有一个矩阵的形状。
给定数组各维的长度,它的矩阵样子就很明显了。比如,a3各个维数的大小分别是10,20和30,对应的,容易指出:这个数组包含10*20*30个元素。
相反,变量j2是一个不整齐数组,或者说是"数组的数组"。特别的,j2表示一个int类型数组的数组,或者说j2是一个一维的、数组元素是int[]类型的数组。它里面的每一个int[]类型的元素都可以分别实例化,这就形成了j2的不整齐的形状。
例子中里面的每个int[]都有不同的长度。特别的,j2[0]的长度是3,j2[1]是6,j2[2]是9。
(注意:在C++中,定义数组int x[3][5][7]表示一个3维的矩形数组,在C#中,int[][][]定义了一个不整齐数组)
元素的类型和数组的形状(包括不整齐数组和矩形数组),以及维数,是数组类型的一部分。换句话说,数组的大小--由每一维的大小来共同确定,并不是数组类型的一部分。
这种区分在语言的语法上是很清楚的,因为数组每一维的大小是在数组构造表达式中指出的,而不是在数组类型中指出的。比如
int[,,] a3 = new int[10, 20, 30];
包含一个数组类型int[,,]表达式,以及数组构造表达式 new int[10, 20, 30].
对于局部变量和字段的声明,可以用一种缩写的方式,如下所示:
int[] a1 = new int[] {1, 2, 3};
可以缩写成
int[] a1 = {1, 2, 3};
在语义上是不变的。
上下文的语境确定了当前正在初始化的数组的类型,这个类型的信息是数组初始化器如{1,2,3}需要的。
例子:
1 class Test
2 {
3 static void Main() {
4 short[] a = {123};
5 int[] b = {123};
6 long[] c = {123};
7 }
8 }

展示了同一个数组初始化器可以用在各种不同的数组类型上。因为需要上下文来确定数组初始化器的类型,除非明确地指出数组的类型,否则不能使用数组的初始化器。


posted on 2009-03-19 17:20  apple123  阅读(1093)  评论(0编辑  收藏  举报