1 索引器定义
首先看看索引器的本质:索引器是一个存在于类或结构中的形式相似于属性(对字段的封装)的特殊方法。
索引器是实例化方法(不可定义为静态static,它属于对象),拥有get与set访问器。其中get访问器具有和索引器相同的形参表,set访问器具有和索引器相同的形参表+value。说白了:索引器就是属性加强版本——它可将多个字段(普通变量,或者数组、顺序表等集合)同时进行封装,而属性只能对一个字段进行封装!
索引器定义(声明)的格式如下:
修饰符 数据类型 this[索引类型 index]
{
set //参数:index,value
{
设置代码;
}
get //参数:index
{
获取代吗;
}
}
2 索引器与数组、属性的区别
2.1 索引器与数组
索引器 | 数组 |
---|---|
索引器下标无限制(int,string,…) | 数组下标必须是int型 |
索引器是类/结构中的一个成员,允许成员重载 | 数组不能重载 |
索引器是一种特殊方法 | 数组是自定义引用类型变量 |
2.2 索引器与属性
索引器 | 属性 |
---|---|
索引器主要是对类中数组、集合的封装 | 属性主要是对类中的字段封装 |
对象如同是一个数组 | 属性如同是字段 |
索引器必须为实例成员;访问:对象名[索引] | 属性可为静态成员或实例成员;访问:类名.属性、对象名.属性 |
索引器可以重载 | 属性不能重载(参数都没有!) |
get访问器具有同索引器相同的形参 | get访问器无参数 |
除value外,set访问器还具有索引器形参 | set访问器隐含value参数 |
3 示例代码
3.1 索引器封装多个字段
public class CourseGrade
{
//索引器封装多个字段
private float Chinese = 95;
private float Math = 100;
private float English = 93;
public float this[int index]
{
set
{
//多个字段,以switch来选择
switch (index)
{
case 0: Chinese = value; break;
case 1: Math = value; break;
case 2: English = value; break;
default: Console.Write("超出索引!"); break;
}
}
get
{
switch (index)
{
case 0: return Chinese;
case 1: return Math;
case 2: return English;
default: throw new ArgumentOutOfRangeException();
}
}
}
}
class SomePlace
{
static void Main(string[] args)
{
CourseGrade cg = new CourseGrade();
cg[0] = 99;
cg[1] = 100;
cg[2] = 95;
//cg[3] = 99;//超出索引
Console.WriteLine("语文:{0},数学:{1},英语:{2}", cg[0], cg[1], cg[2]);
Console.ReadKey();
}
}
3.2 索引器封装数组
class Student //internal
{
//类中:数组、集合等的封装
private string[] stuName = new string[20];
private string[] stuNum = new string[20];
//索引器—"对象数组":对象为数组名;索引为int、string等
public string this[int n,string index]//this→对象
{
set //参数n,index(name,num),value
{
if (index == "name") stuName[n] = value;
else if (index == "num") stuNum[n] = value;
}
get //参数n,index(name,num)
{
if (index == "name") return stuName[n];
else if (index == "num") return stuNum[n];
else return "Unknown";
}
}
}
class Program
{
static void Main(string[] args)
{
Student st = new Student();
st[0, "name"] = "杨**";st[0, "num"] = "2014301610498";
st[1, "name"] = "涂**";st[1, "num"] = "2020301610234";
for(int i=0; i<2; i++)
{
Console.WriteLine("姓名:{0};学号:{1}", st[i, "name"], st[i, "num"]);
}
Console.ReadKey();
}
}
参考文献
[1] 李军.面向对象和组件的C#编程[M].北京:科学出版社,2013.
[2] 刘春茂,李琪.C#程序开发案例课堂[M].北京:清华大学出版社,2018.