数组是允许将多个数据项当做一个集合来处理的机制。CLR支持一维数组、多维数组和交错数组(即由数组构成的数组)。所有数组类型都隐式地从System.Array抽象类派生,后者又派生自System.Object。这意味着数组始终为引用类型,是在托管堆上进行分配的。在你的应用程序的变量或字段中,包含的是对数组的引用,而不是包含数组本身的元素。
Int32[] myIntegers; //声明一个数组引用
myIntegers=new Int32[100]; //创建含有100个Int32的数组
引用类型的数组:
Control[] myControls; //声明一个数组引用
myControls=new Control[50]; //创建含有50个Control引用的数组
每个数组都关联了一些额外的开销信息。
创建一个二维数组,由Double值构成
Double[,] myDoubles=new Double[10,20];
创建一个三维数组,由String引用构成
String[,,] myStrings=new String[5,3,10];
初始化数组元素
C#允许用一个语句来创建初始化数组
String[] names=new String[]{"yxd","sxd"};
大括号中的以逗号分隔的数据项称为数组初始化器。在方法中声明一个局部变量来引用初始化好的数组,可利用C#的“隐式类型的局部变量”功能来稍微简化一下代码:
var names=new String[]{"yxd","sxd"};
可利用C#的隐式类型的数组功能让编译器推断数组的类型。
var names=new []{"yxd","sxd",null};
数组转型
对于元素为引用类型的数组,CLR允许将数组元素从一种类型隐式转型另一种类型。为了成功转型,两个数组类型必须维数相同,而且从源类型到目标类型,必须存在一个隐式或显式转换。CLR不允许将值类型元素的数组转型为其他任何类型。
某些情况下,将数组从一种类型转换为另一种类型是非常有用的。这种功能称为数组协变性。
所有数组都隐式派生自System.Array
所有数组都隐式实现IEnumerable,ICollection和IList
许多方法都能操作各种集合对象,因为在声明它们时,使用了IEnumberable,ICollection和IList等参数。
数组的传递和返回
数组作为实参传给一个方法时,实际传递的是对该数组的引用。因此,被调用的方法能修改数组中的元素。如果不想被修改,必须生成数组的一个拷贝,并将这个拷贝传给方法。注意,Array.Copy方法执行的是浅拷贝。换言之,如果数组元素是引用类型,新数组将引用现有的对象。
创建下限非零的数组
数组的访问性能
不安全的数组访问和固定大小的数组