什么是索引器?

索引器(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 { /* 返回 index 对应的值 */ }
set { /* 设置 index 对应的值 */ }
}
示例代码
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])。

索引器可以有多个参数,属性没有参数。

总结

索引器用于让对象支持类似数组的索引访问,适用于封装集合或需要直接通过索引操作数据的场景。合理使用索引器可以提升代码的可读性和易用性,但需注意边界检查和参数逻辑。