概念
索引器是一种特殊的类的成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写。
当一个类包含了数组和集合成员时,使用索引器将大大简化对数组或集合成员的存取操作。
可以通过索引器可以存取类的实例的数组成员,操作方法和数组相似。
索引器(Indexer)可被重载,索引器声明的时候也可带有多个参数,且每个参数可以是不用的类型
定义
定义索引器的方式与定义属性有些类似,形式如下:
访问修饰符 数据类型 this[数据类型 X]
{
get{获取属性的代码};
set{设置属性的代码};
}
public string this[int a]
{
get { return a; }
set { a = value; }
}
使用
对象名[索引]
其中索引的数据类型必须与索引器的索引类型相同
比较
索引器与数组的区别
1.索引器的索引值(Index)类型不受限制
2.索引器允许重载
3.索引器不是一个变量
索引器和属性的不同点
1.属性以名称来标识,索引器以函数形式标识
2.索引器可以被重载,属性不可以
3.索引器不能声明为static,属性可以
代码:
字段+属性+索引器
class Class1
{
private int a; //隐藏字段a
public int this[int b] //公开的属性
{
get { return a; }
set { a = value;}
}
public int this[string c] 索引器[]中数据类型不同 决定了输入时进入哪个
{
get { return a; }
set { a = value; }
}
}
static void Main(string[] args)
{
Class1 class1 = new Class1(); //创建实例
class1[1] = 56; //[]中为int类型 进入上面第一个索引器中
Console.WriteLine(class1[1]); // 输出 56
class1["qw"] = 13; //[]中为string类型 进入上面第二个索引器中
Console.WriteLine(class1["qw"]);//输出 13
class1["zx"] = 40;
Console.WriteLine(class1["zx"]); 输出 40
Console.WriteLine(class1["qw"]); 输出 40
Console.WriteLine(class1[1]); 输出 40
Console.ReadKey();
}
数组+索引器
class Class1
{
string[] Aa = new string[5];
public string this[int a]
{
get { return Aa[a]; } //将从外面接收的数字转化坐标
//使坐标对应的字符串放入数组Aa中
set { Aa[a] = value; } //从外面接收字符串
}
public void O() //创建方法O
{
foreach (var item in Aa) //遍历输出Aa
{
Console.WriteLine(item);
}
}
}
static void Main(string[] args)
{
Class1 class1 = new Class1();
class1[0] = "q"; class1[1] = "w"; class1[2] = "e";
class1[3] = "r"; class1[4] = "t";
class1.O();
Console.ReadKey();
}
-----------------------------------------------输出结果
q
w
e
r
t
或以下输出
static void Main(string[] args)
{
Class1 class1 = new Class1();
class1[0] = "q"; class1[1] = "w"; class1[2] = "e";
class1[3] = "r"; class1[4] = "t";
Console.WriteLine(class1[0]+ class1[1]+ class1[2]+ class1[3]+ class1[4]);
Console.ReadKey();
}
-----------------------------输出结果
qwert
重点:
字典+索引器
class Class1
{
//字典 Dictionary 使用键值对形式 通过键获取值<键,值>
Dictionary<int, string> Oo = new Dictionary<int, string>();
//索引器
public string this[int a]
{
get { return Oo[a]; }
set { Oo[a] = value; }
}
}
class Program
{
static void Main(string[] args)
{
Class1 P = new Class1();
P[0] = "一只羊";
P[1] = "两只羊";
P[2] = "三只羊";
P[3] = "四只羊";
Console.WriteLine(P[0]+ P[1]+ P[2]+ P[3]);
Console.ReadKey();
}
}
--------------------------------------------输出结果
一只羊两只羊三只羊四只羊
ArrayList数组+索引器(修改List数组中的数值)
class Class1
{
public List<string> list = new List<string>(3) { "qq","ww","ee"};
public string this[int a]
{
get { return list[a]; } //将接收放入数组
set { list[a] = value; } //将接收放入下标
}
public string this[string b]
{
get { return list[int.Parse(b)]; } //将接收的字符串转化成数组下标
set { list[int.Parse(b)]=value; }
}
}
class Program
{
static void Main(string[] args)
{
Class1 class1 = new Class1();
class1[0] = "qqqqqq"; //因为[]中属性类型是数字 进入第一个索引器
class1["1"] = "wwwwwww";//因为[]中属性类型是字符串 进入第二个索引器
class1[2] = "eeeeeeee";
Console.WriteLine(class1[0]);
Console.WriteLine(class1["1"]);
Console.WriteLine(class1[2]);
Console.ReadKey();
}
}