索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便、直观的被引用。索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。定义了索引器的类可以让您像访问数组一样的使用 [ ] 运算符访问类的成员。(当然高级的应用还有很多,比如说可以把数组通过索引器映射出去等等)
本文只是简单演示一下索引器的概念和基本的使用方法:
请看代码,下面是类的定义,中间包含了一个索引器定义
class Program { static void Main(string[] args) { //声明并实例化这个类 Person p = new Person(); //使用索引器的方式来给类的两个属性赋值 p[0] = "jarod"; p[1] = "123456,./"; Console.WriteLine(p.Name); Console.WriteLine(p.Password); Console.ReadKey(); } } public class Person { //定义两个字段信息 private string name; private string password; //定义一个 Name 属性来操作 name 字段 public string Name { set { name = value; } get { return name; } } //定义一个 Password 属性来操作 password 字段 public string Password { set { password = value; } get { return password; } } //定义索引器,name 字段的索引值为 0 ,password 字段的索引值为 1 public string this[int index] { get { if (index == 0) return name; else if (index == 1) return password; else return null; } set { if (index == 0) name = value; else if (index == 1) password = value; } } }
C#索引器(一)
索引器允许类和结构的实例按照与数组相同的方式进行索引,索引器类似与属性,不同之处在于他们的访问器采用参数。被称为有参属性。
简单的索引器实例:
class Program { static void Main(string[] args) { IndexClass a = new IndexClass(); a[0] = "张三"; a[1] = "李四"; a[2] = "王五"; Console.WriteLine("a[0]=" + a[0]); Console.WriteLine("a[1]=" + a[1]); Console.WriteLine("a[2]=" + a[2]); Console.ReadKey(); } } class IndexClass { private string[] name = new string[10]; public string this[int index] { get { return name[index]; } set { this.name[index] = value; } } }
索引器与数组的比较:
索引器的索引值不受类型限制。用来访问数组的索引值一定是整数,而索引器可以是其他类型的索引值。
索引器允许重载,一个类可以有多个索引器。
索引器不是一个变量没有直接对应的数据存储地方。索引器有get和set访问器。
C#索引器(二)
索引器允许类和结构的实例按照与数组相同的方式进行索引,索引器类似与属性,不同之处在于他们的访问器采用参数。被称为有参属性。
简单的索引器实例:
索引器与属性的比较:
标示方式:属性以名称来标识,索引器以函数签名来标识。
索引器可以被重载。属性则不可以被重载。
属性可以为静态的,索引器属于实例成员,不能被声明为static
多参数索引器实例:
class Program { static void Main(string[] args) { ScoreIndex s = new ScoreIndex(); s["张三", 1] = 90; s["张三", 2] = 100; s["张三", 3] = 80; s["李四", 1] = 60; s["李四", 2] = 70; s["李四", 3] = 50; Console.WriteLine("张三课程编号为1的成绩为:" + s["张三", 1]); Console.WriteLine("张三的所有成绩为:"); ArrayList temp; temp = s["张三"]; foreach (IndexClass b in temp) { Console.WriteLine("姓名:" + b.Name + "课程编号:" + b.CourseID + "分数:" + b.Score); } Console.ReadKey(); } class IndexClass { private string _name; private int _courseid; private int _score; public IndexClass(string _name, int _courseid, int _score) { this._name = _name; this._courseid = _courseid; this._score = _score; } public string Name { get { return _name; } set { this._name = value; } } public int CourseID { get { return _courseid; } set { this._courseid = value; } } public int Score { get { return _score; } set { this._score = value; } } } class ScoreIndex { private ArrayList arr; public ScoreIndex() { arr = new ArrayList(); } public int this[string _name, int _courseid] { get { foreach (IndexClass a in arr) { if (a.Name == _name && a.CourseID == _courseid) { return a.Score; } } return -1; } set { arr.Add(new IndexClass(_name, _courseid, value)); //arr["张三",1]=90 } } //重载索引器 public ArrayList this[string _name] { get { ArrayList temp = new ArrayList(); foreach (IndexClass b in arr) { if (b.Name == _name) { temp.Add(b); } } return temp; } } } }
备注:
所有索引器都使用this关键词来取代方法名。Class或Struct只允许定义一个索引器,而且总是命名为this。
索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。
get 访问器返回值。set 访问器分配值。
this 关键字用于定义索引器。
value 关键字用于定义由 set 索引器分配的值。
索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。
索引器可被重载。
索引器可以有多个形参,例如当访问二维数组时。
索引器可以使用百数值下标,而数组只能使用整数下标:如下列定义一个String下标的索引器
public int this [string name] {...}
属性和索引器
属性和索引器之间有好些差别:
类的每一个属性都必须拥有唯一的名称,而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)。
属性可以是static(静态的)而索引器则必须是实例成员。