背景:                 
[本书目录] [图书首页] [本书讨论区]  
链接地址:http://www.17xie.com/read-58477.html    注册17xie 一起来写书 实现您的出书梦想!

如果需要使用同一类型的多个对象,就可以使用集合和数组。C#用特殊的记号声明和使用数组。Array类在后台发挥作用,为数组中元素的排序和过滤提供了几个方法。

使用枚举器,可以迭代数组中的所有元素。

本章讨论如下内容:

●       简单数组

●       多维数组

●       锯齿数组

●       Array类

●       数组的接口

●       枚举

5.1  简单数组

如果需要使用同一类型的多个对象,就可以使用数组。数组是一种数据结构,可以包含同一类型的多个元素。

5.1.1  数组的声明

在声明数组时,应先定义数组中元素的类型,其后是一个空方括号和一个变量名。例如,下面声明了一个包含整型元素的数组:

int[] myArray;

5.1.2  数组的初始化

声明了数组后,就必须为数组分配内存,以保存数组的所有元素。数组是引用类型,所以必须给它分配堆上的内存。为此,应使用new运算符,指定数组中元素的类型和数量来初始化数组的变量。下面指定了数组的大小。

提示:

值类型和引用类型请参见第3章。

myArray = new int[4];

在声明和初始化后,变量myArray就引用了4个整型值,它们位于托管堆上,如图5-1所示。

图  5-1

警告:

在指定了数组的大小后,如果不复制数组中的所有元素,就不能重新设置数组的大小。如果事先不知道数组中应包含多少个元素,就可以使用集合。集合请参见第10章。

除了在两个语句中声明和初始化数组之外,还可以在一个语句中声明和初始化数组:

int[] myArray = new int[4];

还可以使用数组初始化器为数组的每个元素赋值。数组初始化器只能在声明数组变量时使用,不能在声明数组之后使用。

int[] myArray = new int[4] {4, 7, 11, 2};

如果用花括号初始化数组,还可以不指定数组的大小,因为编译器会计算出元素的个数:

int[] myArray = new int[] {4, 7, 11, 2};

使用C#编译器还有一种更简化的形式。使用花括号可以同时声明和初始化数组,编译器生成的代码与前面的例子相同:

int[] myArray = {4, 7, 11, 2};

5.1.3  访问数组元素

数组在声明和初始化后,就可以使用索引器访问其中的元素了。数组只支持有整型参数的索引器。

提示:

在定制的类中,可以创建支持其他类型的索引器。创建定制索引器的内容请参见第6章。

通过索引器传送元素号,就可以访问数组。索引器总是以0开头,表示第一个元素。可以传送给索引器的最大值是元素个数减1,因为索引从0开始。在下面的例子中,数组myArray用4个整型值声明和初始化。用索引器0、1、2、3就可以访问该数组中的元素。

int[] myArray = new int[] {4, 7, 11, 2};

int v1 = myArray[0];    // read first element

int v2 = myArray[1];    // read second element

myArray[3] = 44;      // change fourth element

警告:

如果使用错误的索引器值(不存在对应的元素),就会抛出IndexOutOfRangeException类型的异常。

如果不知道数组中的元素个数,则可以在for语句中使用Length属性:

for (int i = 0; i < myArray.Length; i++)

{

   Console.WriteLine(myArray[i]);

}

除了使用for语句迭代数组中的所有元素之外,还可以使用foreach语句:

for (int val in myArray)

{

   Console.WriteLine(val);

}

提示:

foreach语句利用了本章后面讨论的IEnumerable和IEnumerator接口。

5.1.4  使用引用类型

不但能声明预定义类型的数组,还可以声明定制类型的数组。下面用Person类来说明,这个类有两个构造函数、属性Firstname和Lastname、以及ToString()方法的一个重写:

public class Person

{

public Person()

}

{

public Person(string firstname, string lastname)

"{

this. firstname = firstname;

this.lastname = lastname;

}

private string firstname;

public string Firstname

{

     get { return firstname;}

     set { firstname = value; }

}

private string lastname;

public string Lastname

{

     get { return lastname;}

     set { lastname = value; }

}

public override string ToString()

{

     return firstname + " " + lastname;

}

}

声明一个包含两个Person元素的数组,与声明一个int数组类似:

Person[] myPersons = new Person[2];

但是必须注意,如果数组中的元素是引用类型,就必须为每个数组元素分配内存。若使用了数组中未分配内存的元素,就会抛出NullReferenceException类型的异常。

提示:

第13章介绍了错误和异常的详细内容。

使用从0开始的索引器,可以为数组的每个元素分配内存:

myPersons [0] = new Person("Ayrton", "Senna");

myPersons [1] = new Person("Michael", "Schumacher");

图5-2显示了Person数组中的对象在托管堆中的情况。myPersons是一个存储在堆栈上的变量,该变量引用了存储在托管堆上的Person元素数组。这个数组有足够容纳两个引用的空间。数组中的每一项都引用了一个Person对象,而这些Person对象也存储在托管堆上。

图  5-2

与int类型一样,也可以对定制类型使用数组初始化器:

Person[] myPersons = {new Person("Ayrton", "Senna"),

new Person("Michael", "Schumacher") };


字数:3314    最后更新:7个月以前 [04-10 21:15]happyskynet 修改
本页编辑者:happyskynet  
[前一页]:4.5 小结  [后一页]:5.2 多维数组
[在本页中加入书签] [收藏本书] [推荐本书]
  17xie论坛 > 本书讨论区 > 本页评论   (共0条)
发表评论

用户名称 匿名发表
评论内容
验证码

关于我们 | 版权声明 | 免责声明 | 诚聘英才 | 联系我们 | 合作伙伴 | 友情链接 | 广告合作 | 提交意见
Copyright © 2007 17xie.com 互联网协同写书平台 京ICP备08002671号