====== C# 索引器 (Indexer) ======
**索引器(Indexer)** 是 C# 中的一种特殊成员,它允许你像**访问数组一样**,通过下标(索引)来访问类或结构体中的数据。
简单来说,索引器就是**让对象“伪装”成一个数组**。
===== 1. 核心概念 =====
为什么要使用索引器?
* **无索引器时**:如果一个类包含一组数据(例如学生列表),想要获取特定数据,通常需要定义显式的方法,如 `GetStudent(0)`。
* **有索引器时**:可以直接使用对象实例加上方括号 `[]` 来访问,代码更加直观、简洁。
**主要特点:**
- 使用 ``this`` 关键字定义。
- 参数不仅限于整数(``int``),可以使用任意类型(如字符串)。
- 本质上是一组 ``get`` 和 ``set`` 访问器。
===== 2. 语法结构 =====
索引器的定义格式如下:
[访问修饰符] [返回类型] this[[参数类型] [参数名]]
{
get
{
// 返回值的逻辑
}
set
{
// 设置值的逻辑,使用隐式参数 value
}
}
===== 3. 代码示例 =====
==== 示例 A:使用整数索引(像数组一样) ====
这是一个最基础的用法,模拟一个简单的相册类。
public class PhotoAlbum
{
// 内部存储数据的数组
private string[] photos = new string[5];
// 定义索引器
public string this[int index]
{
get
{
// 可以添加边界检查逻辑
if (index < 0 || index >= photos.Length)
return "无效索引";
return photos[index];
}
set
{
if (index >= 0 && index < photos.Length)
photos[index] = value;
}
}
}
// 使用方式
class Program
{
static void Main()
{
PhotoAlbum album = new PhotoAlbum();
// 1. 存入数据(调用 set)
album[0] = "假期照片.jpg";
album[1] = "全家福.jpg";
// 2. 取出数据(调用 get)
System.Console.WriteLine(album[0]); // 输出:假期照片.jpg
}
}
==== 示例 B:使用字符串索引(像字典一样) ====
索引器的参数不必是整数。下面的例子展示了通过名字查找电话号码。
using System.Collections.Generic;
public class PhoneBook
{
private Dictionary contacts = new Dictionary();
// 定义索引器:输入是 string (名字),返回是 string (号码)
public string this[string name]
{
get
{
return contacts.ContainsKey(name) ? contacts[name] : "号码不存在";
}
set
{
contacts[name] = value;
}
}
}
// 使用方式
class Program
{
static void Main()
{
PhoneBook myPhone = new PhoneBook();
myPhone["张三"] = "13800138000"; // 写入
System.Console.WriteLine(myPhone["张三"]); // 读取
}
}
===== 4. 索引器与属性的区别 =====
^ 特性 ^ 索引器 (Indexer) ^ 属性 (Property) ^
| **访问方式** | 通过索引访问:``obj[index]`` | 通过名称访问:``obj.MyProp`` |
| **名称** | 在定义中使用 ``this`` 关键字,无特定名称 | 必须有明确的名称 |
| **参数** | 必须至少有一个参数 | 没有任何参数 |
| **重载** | 可以重载(只要参数类型或数量不同) | 不能重载 |
===== 5. 总结 =====
* **直观性**:让集合类的对象使用起来更自然。
* **封装性**:隐藏了内部数据存储的细节(无论是数组、链表还是数据库)。
* **安全性**:可以在 ``get/set`` 中加入逻辑判断,防止非法访问。