C# 索引器
索引器是一组get和set访问器,与属性类似。
和属性一样,索引器不用分配内存来存储。
索引器和属性都主要被用来访问其他数据成员,它们与这些成员关联,并为它们提供获取和设置访问。
属性通常表示单独数据成员,索引器通常表示多个数据成员。
和属性一样,索引器可以只有一个访问器,也可以两个都有。
索引器总是实例成员。因此不能声明为static。
和属性一样,实现get和set访问器的代码不必一定要关联到某个字段或属性。这段代码可以做任何事情或什么也不做,只要get访问器返回某个指定类型的值即可。
索引器的声明:
索引器没有名称,在名称的位置是关键字this。
参数列表在方括号中间。
参数列表中必须至少声明一个参数。
简单声明一个索引器:
using System; namespace 索引器 { class Program { static void Main(string[] args) { syq a = new syq();//实例一个类 a[0] = "多多";//赋值 a[1] = "少少";//赋值 Console.WriteLine("_a 的值为:{0} \r\n_b 的值为:{1}",a[0],a[1]);//输出 取值 Console.ReadKey();//按任意键 } } class syq //类 { private string _a;//私有字段 private string _b;//私有字段 public string this[int index]//索引器 { set//设置值 { if (index == 0)//判断传过来的值 是否为0 { _a = value;//为0 则将值赋值给 _a } else { _b = value;//不为0 则将值赋值给 _b } } get//取值 { return (index == 0) ? _a : _b;//三元运算符。 } } } }
输出结果:
索引器例子:
using System; namespace 索引器1 { class Program { static void Main(string[] args) { Names p = new Names();//实例化类 p[0] = "小猪爷爷";//赋值 p[1] = "小猪奶奶";//赋值 p[2] = "小猪爸爸";//赋值 p[3] = "小猪妈妈";//赋值 p[4] = "小猪佩奇";//赋值 p[5] = "小猪乔治";//赋值 for (int i = 0;i <= 5;i++)//循环 { Console.WriteLine("p[{0}] 是 {1}", i,p[i]);//输出 } Console.ReadKey();// 按任意键 } } class Names // 类 { private string[] name = new string[6]; //私有 字符串数组。 public string this[int index] //索引器 { set //设值 { if (index >= 0 && index < name.Length) //判断参数是否大于等于0 和 小于数组长度 { name[index] = value; //赋值 } } get //取值 { string temp; //声明变量 if (index >= 0 && index < name.Length) // 判断参数是否大于等于0 和 小于数组长度 { temp = name[index]; //取值 } else { temp = "";//为空 } return temp;//返回值 } } } }
输出结果:
只要索引器的参数列表不同,类就可以有任意多个索引器。索引器类型不同是不够的,这叫做索引器重载,因为所有的索引器都有相同的“名称”:this访问引用。
类中重载的索引器必须有不同的参数列表。
索引器的重载例子:
using System; namespace 索引器1 { class Program { static void Main(string[] args) { Names p = new Names();//实例化类 p[0] = "小猪爷爷";//赋值 p[1] = "小猪奶奶";//赋值 p[2] = "小猪爸爸";//赋值 p[3] = "小猪妈妈";//赋值 p[4] = "小猪佩奇";//赋值 p[5] = "小猪乔治";//赋值 for (int i = 0;i <= 5;i++)//循环 { Console.WriteLine("p[{0}] 是 {1}", i,p[i]);//输出 } Console.WriteLine("——————————");//分割 Console.WriteLine("小猪爸爸的索引为:{0}",p["小猪爸爸"]);//查找 小猪爸爸 的索引 Console.WriteLine("小猪佩奇的索引为:{0}", p["小猪佩奇"]);//查找 小猪佩奇 的索引 Console.WriteLine(" 蝙蝠侠 的索引为:{0}", p["蝙蝠侠"]);//查找 蝙蝠侠 的索引 Console.ReadKey();// 按任意键 } } class Names // 类 { private string[] name = new string[6]; //私有 字符串数组。 public string this[int index] //索引器 { set //设值 { if (index >= 0 && index < name.Length) //判断参数是否大于等于0 和 小于数组长度 { name[index] = value; //赋值 } } get //取值 { string temp; //声明变量 if (index >= 0 && index < name.Length) // 判断参数是否大于等于0 和 小于数组长度 { temp = name[index]; //取值 } else { temp = "";//为空 } return temp;//返回值 } } public int this[string n] //索引器的重载 { get//取值 { int index = 0;//声明变量 while (index < name.Length)//判断index的值是否小于 name数组的元素数量 { if (name[index] == n)//判断 { return index;//返回索引 } index++;//自增1 } return -1;//如果没找到 则返回-1. } } } }
输出结果: