C#索引器的用法(附带实例)
C# 中的索引器为访问类或者结构体中封装的列表或字典型数据元素提供了一种自然的访问接口。
索引器和属性很相似,但索引器通过索引值而非属性名称来访问数据元素。例如,string 类具有索引器,可以通过 int 索引访问其中每一个 char 的值:
索引器和属性具有相同的修饰符,并且可以在方括号前插入 ? 以使用 null 条件运算:
一个类型可以定义多个参数类型不同的索引器,一个索引器也可以包含多个参数:
如果省略 set 访问器,则索引器就是只读的。同时,索引器也可以使用表达式体的语法简化其定义:
索引器在内部会编译成名为 get_Item 和 set_Item 的方法,如下所示:
我们可以在自定义类的索引器参数中使用 Index 或者 Range 类型来支持索引和范围操作。例如,我们可以在 Sentence 类中加入以下索引器:
索引器和属性很相似,但索引器通过索引值而非属性名称来访问数据元素。例如,string 类具有索引器,可以通过 int 索引访问其中每一个 char 的值:
string s = "hello"; Console.WriteLine(s[0]); // 'h' Console.WriteLine(s[3]); // 'l'使用索引器的语法就像使用数组一样,不同之处在于索引参数可以是任意类型。
索引器和属性具有相同的修饰符,并且可以在方括号前插入 ? 以使用 null 条件运算:
string s = null; Console.WriteLine(s?[0]); // 输出为空;没有错误。
C#索引器的实现
编写索引器首先要定义一个名为 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 访问器,则索引器就是只读的。同时,索引器也可以使用表达式体的语法简化其定义:
public string this [int wordNum] => words [wordNum];
索引器在内部会编译成名为 get_Item 和 set_Item 的方法,如下所示:
public string get_Item(int wordNum) { ... } public void set_Item(int wordNum, string value) { ... }
我们可以在自定义类的索引器参数中使用 Index 或者 Range 类型来支持索引和范围操作。例如,我们可以在 Sentence 类中加入以下索引器:
public string this [Index index] => words [index]; public string[] this [Range range] => words [range];并进行如下调用:
Sentence s = new Sentence(); Console.WriteLine(s[^1]); // fox string[] firstTwoWords = s[..2]; // (The, quick)