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