索引器(indexer)允许一个对象可以像数组一样被索引,当为类定义一个索引器时,该类的行为就会像一个虚拟数组一样,可以使用数组访问运算符[ ]来访问该类的实例,索引器是一组get和set访问器,与属性类似。
(1)和属性一样,索引器不用分配内存来存储 (2)索引器和属性都主要被用来访问其他数据成员,它们与这些成员关联,并为它们提供获取和设置访问,只是属性通常表示单独的数据成员,索引器通常表示多个数据成员,索引器本身可以是任何类型,不仅仅是数值类型。 (3)和属性一样,索引器可以只有一个访问器,也可以俩个都有 (4)索引器总是实例成员,因此不能声明为static (5)和属性一样,实现get和set访问器的代码不必一定要关联到某个字段或属性,这段代码可以做任何事情或什么也不做,只要get访问器返回某个指定类型的值即可 (6)和属性一样,不能显式调用get和set访问器,并且在set访问器中包含隐式参数value
(1)索引器没有名称,在名称的位置是关键字this (2)参数列表在方括号中 (3)参数列表中必须至少声明一个参数(4)声明为public,以便从类的外部访问
类中的索引器如果想构成重载,则必须有不同的参数列表,仅是索引器类型不同是构不成重载的,这点类似于C++中的函数重载
class A { public string s1; public string s2; public int i1; public int i2; public string this[int index] { set { switch(index) { case 0:s1 = value; break; case 1:s2 = value; break; default: throw new ArgumentOutOfRangeException("index"); } } get { switch(index) { case 0:return s1; case 1:return s2; default: throw new ArgumentOutOfRangeException("index"); } } } public int this[string index2] //如果写成public int this[int index1]则会出错,这构不成重载,会造成二义性 { set { switch(index2) { case "i1": i1 = value; break; case "i2":i2 = value; break; default: throw new ArgumentOutOfRangeException("index2"); } } get { switch(index2) { case "i1":return i1; case "i2":return i2; default: throw new ArgumentOutOfRangeException("index2"); } } } } class Program { static void Main(string[] args) { A a = new A(); a[0] = "sss"; a[1] = "ssss"; Console.WriteLine(a.s1); //sss Console.WriteLine(a.s2); //ssss a["i1"] = 100; a["i2"] = 200; Console.WriteLine(a.i1); //100 Console.WriteLine(a.i2); //200 } }