索引器允许类或者结构的实例就像数组一样进行索引,当您为一个类定义一个索引器时,这个类就会像一个数组一样,您可以使用数组访问符 '[]' 对该类的实例进行访问.. 索引器与 属性 类似,但是索引器要采用参数,(也可以这么认为,索引器是一个类的属性,同样也是通过访问器(一种特殊的方法) 实现的)
为了更清楚一点,还是举个例子吧, 大学是人生中最悠闲的时光,同学们可以做许多自己曾经想做而因为种种原因没有做的事,逃课很明显正是其中之一..为了制止逃课的行为,每次上课的时候老师都要点名或者是点学号,我是4班的,老师喜欢点学号,"4班1号" 然后下面大声答"到……",“4班2号”,“到”,“4班3号”...... "3号。。3号同学。。",“老师HC666今天肚子疼上医院了”(中国好室友阿^_^),“哦,4号”..... 老师点名就是对4班的一个索引。
如果将class4看作是由Classes类实例化的一个对象,class[1]就是对1号同学的索引,(想一想数组就明白了)那怎么实现呢?
定义索引器:
上面也说了,索引器与属性类似,自然也少不了get,set访问器了,索引器也是类的成员,自然也得在类里面定义了,如下:
public 返回值类型 this[参数类型 参数]
{
get { return 参数指定的值; } //get访问器
set { /*设置参数指定的值 */ } //set访问器
}
索引器的实例:
我们将上面的例子代码化,如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test1
{//定义一个能被索引的类
class Classes
{//对类的索引实质是对类中数组的索引
public string[] StudentName=new string[6];
//定义索引器
public string this[int ID]
{
get { return StudentName[ID]; }
set { StudentName[ID] = value; } //set访问器自带value参数
}
}
class Program
{
static void Main(string[] args)
{
Classes class4 = new Classes();
//索引写入
for (int i = 1; i < 6; i++)
{
class4[i] = "HC"+i;
}
//索引读出
for (int j = 1; j < 6; j++)
{
Console.WriteLine(j+"号\t"+class4[j]);
}
}
}
}结果:

重载索引器:
上面的程序中,我们实现了通过学号索引出该学生姓名,那怎么实现通过姓名索引出学号呢?我们将索引看作是一个特殊的方法,方法可以利用重载实现不同的参数相同的功能,那么索引器自然也可以重载。用法与方法重载类似,(查看方法重载点这里),我们还是接着上面的例子,这次要满足使用姓名索引出学号:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test1
{//定义一个能被索引的类
class Classes
{//对类的索引实质是对类中数组的索引
public string[] StudentName=new string[6];
//定义索引器
public string this[int ID]
{
get { return StudentName[ID]; }
set { StudentName[ID] = value; } //set访问器自带value参数
}
//重载索引器参数设为string类型
public uint this[string name]
{
get
{ //找到与name匹配的学号
uint index=1;
while (StudentName[index] != name && index < 6)
{ index++; }
return index;
}
set { }
}
}
class Program
{
static void Main(string[] args)
{
Classes class4 = new Classes();
//索引写入
for (int i = 1; i < 6; i++)
{
class4[i] = "HC"+i;
}
//索引读出,通过学号索引出姓名
for (int j = 1; j < 6; j++)
{
Console.WriteLine(j+"号\t"+class4[j]);
}
//通过姓名索引出学号
for (int k = 1; k < 6; k++)
{
string name="HC"+k;
Console.WriteLine(name+"\t"+class4[name]+"号");//对比上面用法一样参数不一样
}
}
}
}结果:

在上面中我们说了当一个类定义了索引器就可以将这个类当作数组一样看待,那在学习 数组 的时候知道,数组有多维度的,索引器所在的类呢??我们遍历数组用的foreach遍历语句对这个类也能用吗??我下一篇再作介绍吧!!(因为学校要短电了……)希望您继续支持HC666^_^
以上就是C#学习日记28---索引器、重载索引器的内容,更多相关内容请关注PHP中文网(www.php.cn)!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号