索引器允许类或结构的实例就像数组1样进行索引,当您为1个类定义1个索引器时,这个类就会像1个数组1样,您可使用数组访问符 '[]' 对该类的实例进行访问.. 索引器与
属性 类似,但是索引器要采取参数,(也能够这么认为,索引器是1个类的属性,一样也是通过访问器(1种特殊的方法) 实现的)
为了更清楚1点,还是举个例子吧, 大学是人生中最悠闲的时光,同学们可以做许多自己曾想做而由于种种缘由没有做的事,逃课很明显正是其中之1..为了制止逃课的行动,每次上课的时候老师都要点名或是点学号,我是4班的,老师喜欢点学号,"4班1号" 然后下面大声答"到……",“4班2号”,“到”,“4班3号”......
"3号。。3号同学。。",“老师HC666今天肚子疼上医院了”(中国好室友阿^_^),“哦,4号”..... 老师点名就是对4班的1个索引。
如果将class4看做是由Classes类实例化的1个对象,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
{//定义1个能被索引的类
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+"号 "+class4[j]);
}
}
}
}
结果:
重载索引器:
上面的程序中,我们实现了通过学号索引出该学生姓名,那怎样实现通过姓名索引出学号呢?我们将索引看做是1个特殊的方法,方法可以利用重载实现不同的参数相同的功能,那末索引器自然也能够重载。用法与方法重载类似,(查看方法重载点这里),我们还是接着上面的例子,这次要满足使用姓名索引出学号:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test1
{//定义1个能被索引的类
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+"号 "+class4[j]);
}
//通过姓名索引出学号
for (int k = 1; k < 6; k++)
{
string name="HC"+k;
Console.WriteLine(name+" "+class4[name]+"号");//对照上面用法1样参数不1样
}
}
}
}
结果:
在上面中我们说了当1个类定义了索引器就能够将这个类当作数组1样看待,那在学习
数组 的时候知道,数组有多维度的,索引器所在的类呢??我们遍历数组用的foreach遍历语句对这个类也能用吗??我下1篇再作介绍吧!!(由于学校要短电了……)希望您继续支持HC666^_^
您的建议与评论是我完善自我的动力,感谢您的浏览,有毛病的地方欢迎指出来或私信我^_^
版权声明:本文为博主原创文章,未经博主允许不得转载。