什么是索引器?
索引器(Indexer)是 C# 中的一种特殊成员,允许对象像数组或集合一样通过索引(如 [])访问内部元素。
类似于属性(Property),但通过索引参数访问数据。
常用于封装集合类(如自定义列表、字典),使其可以通过索引直接操作元素。
如何定义和使用索引器?
语法结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| 复制 public 返回类型 this[参数类型 index] { get { } set { } } 示例代码 csharp 复制 class StringCollection { private string[] _data = new string[10];
public string this[int index] { get { if (index < 0 || index >= _data.Length) throw new IndexOutOfRangeException(); return _data[index]; } set { if (index < 0 || index >= _data.Length) throw new IndexOutOfRangeException(); _data[index] = value; } } }
var collection = new StringCollection(); collection[0] = "Hello"; Console.WriteLine(collection[0]);
|
关键点
使用 this 关键字定义。
支持多个参数(如多维索引):public int this[int x, int y] { … }。
可以重载(不同参数类型或数量)。
使用场景
适合使用索引器的场景
封装集合类
当类内部包含数组、列表或其他集合时,通过索引器提供类似数组的访问方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 复制 public class MyList<T> { private T[] _items; public T this[int index] { get { return _items[index]; } set { _items[index] = value; } } } 键值对访问 类似字典的键值访问,例如通过字符串索引:
csharp 复制 public class Config { private Dictionary<string, string> _settings = new Dictionary<string, string>(); public string this[string key] { get { return _settings[key]; } set { _settings[key] = value; } } }
|
数学结构
表示矩阵、向量等数学结构时,通过多维索引访问元素:
1 2 3 4 5 6 7 8 9 10
| 复制 public class Matrix { private int[,] _matrix = new int[3,3]; public int this[int row, int col] { get { return _matrix[row, col]; } set { _matrix[row, col] = value; } } }
|
简化代码
当需要通过索引直接操作对象内部数据时,索引器比方法调用更直观:
1 2 3 4 5
| 复制
myObject[5] = 100;
myObject.SetValue(5, 100);
|
注意事项
索引器参数类型
可以是任意类型(如 int、string、enum 等),但需确保逻辑合理。
异常处理
在 get 和 set 中需检查索引有效性,避免越界错误。
不可静态
索引器不能声明为 static。
与属性的区别
属性通过名称访问(如 obj.Name),索引器通过参数访问(如 obj[0])。
索引器可以有多个参数,属性没有参数。
总结
索引器用于让对象支持类似数组的索引访问,适用于封装集合或需要直接通过索引操作数据的场景。合理使用索引器可以提升代码的可读性和易用性,但需注意边界检查和参数逻辑。