索引器初探
先来看看没有索引的简单类,可以使用字段的名称访问它们,代码如下所示:
class student
{
public string? name;
public int age;
public string? grade;
}
internal class Program
{
static void Main(string[] args)
{
var student = new student();
student.name = "小王";
student.age = 20;
student.grade = "大一";
Console.WriteLine($"姓名:{student.name},年龄:{student.age},年级:{student.grade}");
}
}
运行结果,如下所示:

创建的student对象,如下图所示:

然而有的时候,如果使用索引访问它们将会更方便,好像该实例是字段的数组一样,这就是索引器允许做的事。为Student类写一个索引器,就可以不使用点运算符,而是使用索引运算符,它由一对方括号和中间的索引组成,代码如下所示:
class student
{
public string? name;
public int age;
public string? grade;
public string this[int index]
{
//实现索引器的get方法
get
{
switch (index)
{
case 0: return name;
case 1: return age.ToString();
case 2: return grade;
default:
throw new ArgumentOutOfRangeException("index");
}
}
//实现索引器的set方法
set
{
switch (index)
{
case 0: name = value; break;
case 1: age = Convert.ToInt32(value); break;
case 2: grade = value; break;
default:
throw new ArgumentOutOfRangeException("index");
}
}
}
}
internal class Program
{
static void Main(string[] args)
{
var student = new student();
student.name = "小王";
student.age = 20;
student.grade = "大一";
Console.WriteLine($"姓名:{student[0]},年龄:{student[1]},年级:{student[2]}");
}
}
运行结果,如下图所示:

这时,创建的student对象,如下图所示:

索引器
索引器是一组get和set访问器,与属性类似。索引器的表现形式,如下所示:
Type this [ int index]
{
set
{
//Code
}
get
{
//Code
}
}

索引器和属性
索引器和属性在很多方面是相似的。
1、和属性一样,索引器不用分配内存来存储。
2、索引器和属性都主要被用来访问其他数据成员,它们与这些成员关联,并为它们提供获取和设置访问。
属性通常表示单独的数据成员
索引器通常表示多个数据成员
关于索引器的注意事项
1、和属性一样,索引器可以只有一个访问器,也可以两个都有。
2、索引器总是实例成员,因此不能声明为static。
3、和属性一样,实现get和set访问器的代码不必一定要关联到某个字段或属性。这段代码可以做任何事情也可以什么都不做,只要get访问器返回某个指定的类型的值即可。
索引器的set访问器
当索引器被用于赋值时,set访问器被调用,并接受两项数据,如下:
1、一个隐式参数,名称为value,value持有要保存的数据。
2、一个或更多索引参数,表示数据应该保存到哪里。
索引器的get访问器
当使用索引器获取值时,可以通过一个或者多个索引参数调用get访问器,索引参数指示获取哪个值。
索引器重载
只要索引器的参数列表不同,类就可以有任意多个索引器。
之前定义了返回类型为string的索引器,现在仅仅将返回类型设置为int是不够的
参考资料
《C#图解教程(第4版)》——Daniel M. Solis
原文始发于微信公众号(DotNet学习交流):C#中的索引器
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/230856.html