索引器:索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。它可以使得像数组那样对对象使用下标。它提供了通过索引方式方便地访问类的数据信息的方法。
---------摘自百度百科
通俗地讲,就是相当于一个图书馆里很多书,当你通过编号(索引器)的规则编好存放后,可以很轻松方便地找出你想找的某一本书,这就是索引器的最大作用。
那么,在C#中是怎么使用呢?其实就是对某个对象用"[]"在中括号里面加索引就可以使用.好了,疑问来了,为什么数组、集合可以用用这样的方法来取值与赋值呢?我们能不能也写一个所谓的索引器,按照我们自己的某些索引要求来索引呢?带着这个疑问,我打开了Reflector看看C#里Array(数组)与ArrayList(集合)的代码
查看完这些代码就只发现红色圈圈部分有类似用数组或集合取值复制时用的"[]",于是,在此我们可以做三个猜测:
一、这就是所谓的索引器的定义
二、如果这是索引器,那么根据"[]"里有写int index这个变量,我们可以大胆推测不光可以靠数字下标进行索引取值与赋值,还能通过其他类型(例如string)进行索引
三、如果这都是索引器的定义,那么可能索引器其实也是一种特殊的属性,因为其是放在Propertes这一分类里
为了证明以上三个猜测,我自己写了个类与索引器,代码如下
//定义Person类
class Person { public string Name { get; set; }
public int Age { get; set; } }
//定义个可以为Person集合专门做的索引器
class PersonIndexer { List<Person> list; public PersonIndexer(List<Person> list) { this.list = list; } public Person this[string name] { get { foreach (Person p in list) { if (p.Name == name) { return p; } } return null; } set { for (int i = 0; i < list.Count; i++) { if (list[i].Name == name) { list[i] = value; } } } } }
//准备测试索引器是否成功
static void Main(string[] args) { //准备个Person集合 List<Person> list = new List<Person>() { new Person(){ Name="刘德华",Age=16}, new Person(){ Name="张学友",Age=15}, new Person(){ Name="郭富城",Age=14}, new Person(){ Name="黎明",Age=13} }; //创建自己写的Person的索引器对象并传入Person集合 PersonIndexer pIndexer = new PersonIndexer(list); //以姓名为下标得到取得的值 Person p1 = pIndexer["刘德华"]; //以姓名为下标赋值 pIndexer["黎明"] = new Person() { Name="黎明修改后",Age=20}; //输出结果,看是否取值与赋值成功 Console.WriteLine(p1.Name+":"+p1.Age); Console.WriteLine(pIndexer["黎明修改后"].Name + ":" + pIndexer["黎明修改后"].Age); Console.ReadKey(); }
结果如下:
则现在我们可以证明出上面我们猜测过的三个结果
即:索引器的定义方法为
[访问修饰符] [返回值类型] this 中括号,中括号里写以何种类型进行索引
且索引器的索引不止是int,可以是其他任意类型
例:public Person this[string name];
拓展:
思考:
从上图可以看出,其实get与set就是两个方法,那么既然是方法,索引器是否会有重载呢?
答案是肯定的!也就是,你可以给自己写的索引器添加多种索引方式,比如上面我写的索引器是用string类型的,你也可以再加一个改为int类型的!具体的,我就不再演示画图了,自己试试吧!