小天:如果是申明和初始化的时候都没有给值,事后如何给?
老田:你的意思是需要访问数组吧?数组在声明和初始化后,就可以使用索引器访问其中的元素了。不过需要注意数组只支持有整型参数的索引器。
通过索引器传送元素号,就可以访问数组。索引器总是以0开头,表示第一个元素。可以传送给索引器的最大值是元素个数减1,因为索引从0开始。在下面的例子中,数组myInt3用7个整型值声明和初始化。用索引器0、1、2、3、4、5、6就可以访问该数组中的元素。
int[] myInt3 = { 11, 12, 30, 53, 21, 38, 27 }; //访问数组 int i1 = myInt3[0]; //将数组myInt3中的第一项交给变量i1; int i2 = myInt3[3]; //将数组myInt3中的第四项交给变量i2; myInt3[2] = 18; //修改数组myInt3中的第三项的值 myInt3[5] = 90; //修改数组myInt3中的第六项的值 |
如果使用错误的索引器值(不存在对应的元素),就会抛出IndexOutOfRangeException类型的异常。如图5-3
图5-3
小天:如果我们去访问一个没有值的数组项有什么效果?
老田:自己试下不就知道,我是人,我又不是C#编译器。如下:
int[] myInt5 = new int[7]; myInt5[2] = 18; //不会出错,因为这是为项赋值 int i4 = myInt5[0]; //不会出错 |
小天:数组才初始化,项中应该没有值啊,为什么不会出错呢?
老田:因为myInt5在初始化分配内存空间的时候顺便也实例化了一个int类型放在这个空间中。所以这个时候项中是有值的,只不过是int类型初始化出来的0而已。
小天:如果是那种使用直接给值进行初始化的数组,怎么能够知道到底有多少项呢?
老田:如果不知道数组中的元素个数,则可以使用数组的Length属性。如下
int[] myInt6 = { 11, 12, 30, 53, 21, 38, 27 }; int i5 = myInt6.Length; MessageBox.Show(i5.ToString()); //猜猜我这个代码是写在什么类型程序的什么地方的? |
小天:如果我想依次取出数组中的全部项的值并显示出来,怎么做呢?
老田:有两种形式,一种是使用for循环来遍历整个数组,第二种则是使用foreach语句迭代整个数组。下面分别使用了两种形式(其中一种for循环扩展了一些知识):
//申明一个数组 int[] myInt7 = new int[] { 11, 12, 30, 53, 21, 38, 27 }; //简易的读出数组的值 for (int i = 0; i < myInt7.Length; i++) { Console.WriteLine(myInt7[i].ToString()); } //由于上面的显示太简单了,我们将之拼成一个字符串来显示,完善如下 //-------------申明一个字符串变量用来接收最后显示结果--------------- string str = ""; //下一句申明循环从0开始,循环整数组项 //可以尝试将小于改为小于等于,并用断点监视i的值 for (int i = 0; i < myInt7.Length; i++) { str += myInt7[i].ToString() + ","; } //因为str的值,最后会有一个逗号,下面这句代码则是将最后一个逗号的位置找出来并移除 //如果不知道这句的意思,可以去MSDN找下Remove和LastIndexOf的解释 str = str.Remove(str.LastIndexOf(',')); label1.Text = str; //-------------完善版for循环示例完毕--------------- //下面实例为使用foreach来迭代整个数组,最终和for的简易实例一样,你自己来完善吧 foreach (int v in myInt7) { Console.WriteLine(v.ToString()); } |
小天:我觉得foreach也太厉害了,是什么机制?还有数组中可以放的都是这些预定义类型吗?能放自定义类型不?
老田:foreach语句利用了本章后面讨论的IEnumerable和IEnumerator接口。下面来看看foreach的机制。
本文章为天轰穿原创作品,转载请注明出处及作者。