索引器为访问类或者结构体中封装的列表或字典型数据元素提供了自然的访问接口。索引器和属性很相似,但索引器通过索引值而非属性名称访问数据元素。例如string类具有索引器,可以通过int索引访问其中每一个char的值。
string s = "hello";
Console.WriteLine (s[0]); // 'h'
Console.WriteLine (s[3]); // 'l'
使用索引器的语法就像使用数组一样,不同之处在于索引参数可以是任意类型。
索引器和属性具有相同的修饰符(请参见3.1.6节),并且可以在方括号前插入?以使用null条件运算(请参见2.10节):
string s = null;
Console.WriteLine (s?[0]); // Writes nothing; no error.
1 索引器的实现
编写索引器首先要定义一个名为this的属性,并将参数定义放在一对方括号中。例如:
class Sentence
{
string[] words = "The quick brown fox".Split();
public string this [int wordNum] // indexer
{
get { return words [wordNum]; }
set { words [wordNum] = value; }
}
}
以下展示了索引器的使用方式:
Sentence s = new Sentence();
Console.WriteLine (s[3]); // fox
s[3] = "kangaroo";
Console.WriteLine (s[3]); // kangaroo
一个类型可以定义多个参数类型不同的索引器,一个索引器也可以包含多个参数:
public string this [int arg1, string arg2]
{
get { ... } set { ... }
}
如果省略set访问器,则索引器就是只读的,并且可以使用C# 6的表达式语法来简化定义。
public string this [int wordNum] => words [wordNum];
2 CLR索引器的实现
索引器在内部会编译为名为get_Item和set_Item的方法,如下所示:
public string get_Item (int wordNum) {...}
public void set_Item (int wordNum, string value) {...}