本节课我们来学习索引器,索引器的功能类似于属性,它也有一对get和set访问器,只不过属性是用来封装字段的,而索引器是利用访问器来有条件的来控制类中的数组类成员如数组和集合,get和set访问器的用法与属性一致,这里不做过多的讲解,首先我们定义一个int类型的数组a,观察一下索引器的具体语法:
int [] a={1,2,3};//类中的数组也应该定义为私有变量,对外只提供索引器进行对数组的访问
public int this[int index] //注意在定义索引器时要与所封装的数组类型一致。 { get { return a[index];//通过get访问器,在外部类通过索引器访问数组时,直接给出index值,再通过index值作为数值的索引值得到数组的元素值 } //使用set访问器,可以限制不符合条件的数值不许给数组a赋值 set { a[index]=value;
} }
其中,index作为访问int型数组的索引值,索引值的数值类型可以是整型,也可以为string类型,这主要是取决于索引器所封装的对象的类型,当封装的对象是哈希表时,索引值index的数据类型就可以是string型,即将索引当成是哈希表的键。this关键字用于定义索引器,value关键字代表由set索引器获得的值。 在使用索引器时采用“类的对象[索引值]” 的方式进行对数组的访问,下面我们来看一个简单的实例,在本例中定义了一个student类,类中有一个存放五名学生成绩的数组CJ,同时定义了一个索引器目的是封装数组CJ,同时在第三方类中使用索引器的set访问器对给数组CJ赋值起到有条件的限制。
索引器 1 // 定义了一个学生类,其中CJ数组记录了学生的成绩 2 class Student 3 { 4 // 数组CJ定义了五个学生的成绩。 5 int [] CJ = { 81 , 72 , 63 , 64 , 95 } ; 6 // 定义一个索引器供外部类访问CJ数组 7 public int this [ int Xh] 8 { 9 get 10 { // 返回索引值为学号-1的数组CJ的元素值,即学生的成绩 11 return CJ[Xh - 1 ]; 12 }13 // 使用set访问器,限制不符合条件的数值不许给数组CJ赋值 14 set 15 { // 当外部给数组的元素赋值时,先判断值的条件,满足条件时,将value赋值给索引值为学号-1的成绩数组CJ的元素。 16 if (value > 100 || value < 0 ) 17 Console.WriteLine(" 学生的分数应在0到100之间 " ); 18 else 19 CJ[Xh - 1 ] = value; 20 }21 }22 }23 class Program 24 { 25 static void Main( string [] args) 26 { 27 28 Console.Write(" 请输入查询成绩的学生学号1-5号: " ); 29 int xh = int .Parse(Console.ReadLine()); 30 31 // 创建一个student类的实例对象class1班级1. 32 Student class1 = new Student(); 33 // 使用“对象[索引值]”的方式得到student类中数组CJ的元素值。 34 Console.WriteLine(class1[xh]); 35 36 // 如果想给数组的元素赋值时,就使用到了set访问器,先对xgcj进行判断,再赋值。 37 Console.Write( " 请输入修改成绩的学生学号1-5号: " ); 38 int xgxh = int .Parse(Console.ReadLine()); 39 Console.Write(" 请输入修改的成绩: " ); 40 int xgcj = int .Parse(Console.ReadLine()); 41 42 // 赋值也使用对象【索引值】的方式 43 class1 [xgxh ] = xgcj; 44 Console.WriteLine(" 修改后的学生成绩为: " + class1[xgxh]); 45 46 Console.WriteLine(" *********************************** " ); 47 48 // 当给数组中第4个元素不符合条件的值时,就会执行set语句中的if的语句块, 49 // 即提示出错误提示。 50 class1[ 4 ] = 102 ; 51 52 }53
运行结果如下: 请输入查询成绩的学生学号1-5号:4 64 请输入修改成绩的学生学号1-5号:4 请输入修改的成绩:78 修改后的学生成绩为:78 *********************************** 学生的分数应在0到100之间 请按任意键继续. . .
请同学们注意代码第43行,要记住当一个类定义了索引器后,想访问数组的值,就可以把类的对象名想像成数组名,像数组通过索引赋值和取值一样,这样能更有助于同学们记住索引器的用法。下面我们来看一下用索引器封装哈希表的用法实例:
索引器二 1 // 定义了一个学生类,其中CJ数组记录了学生的成绩 2 class Student 3 { 4 // 数组CJ定义了五个学生的成绩。 5 Hashtable CJ = new Hashtable(); 6 7 8 // 定义一个索引器供外部类访问CJ,学生姓名为索引值 9 public string this [ string Name] 10 { 11 get 12 { // 通过传入的哈希表的键,得到值。 13 return CJ[Name].ToString (); 14 }15 16 set 17 { 18 // 给哈希表赋值的两种方式。 19 CJ[Name] = value; 20 // CJ.Add(Name,value ); 21 } 22 }23 }24 class Program 25 { 26 static void Main( string [] args) 27 { 28 29 Console.Write(" 请输入学生的姓名: " ); 30 string name = Console.ReadLine(); 31 Console.Write(" 请输入此学生的成绩: " ); 32 string cj = Console.ReadLine(); 33 34 // 创建一个student类的实例对象class1班级1. 35 Student class1 = new Student(); 36 37 // 赋值也使用对象【索引值】的方式 38 class1 [name] = cj; 39 40 Console.WriteLine(" 姓名为{0}的学生成绩为:{1} " ,name,class1 [name]); 41 42 43 }
运行如下: 请输入学生的姓名:咸蛋超人 请输入此学生的成绩:25 姓名为咸蛋超人的学生成绩为:25 请按任意键继续. . .
索引器的具体用法希望通过这两个实例同学们能理解好并掌握,当然索引器还有更加复杂的用法,同学们可以在日后随着学习的深入继续深化。