索引器(Indexer) 是 C# 中的一种特殊成员,它允许你像访问数组一样,通过下标(索引)来访问类或结构体中的数据。
简单来说,索引器就是让对象“伪装”成一个数组。
为什么要使用索引器?
主要特点:
索引器的定义格式如下:
[访问修饰符] [返回类型] this[[参数类型] [参数名]] { get { // 返回值的逻辑 } set { // 设置值的逻辑,使用隐式参数 value } }
这是一个最基础的用法,模拟一个简单的相册类。
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 } }
索引器的参数不必是整数。下面的例子展示了通过名字查找电话号码。
using System.Collections.Generic; public class PhoneBook { private Dictionary<string, string> contacts = new Dictionary<string, string>(); // 定义索引器:输入是 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["张三"]); // 读取 } }
| 特性 | 索引器 (Indexer) | 属性 (Property) |
|---|---|---|
| 访问方式 | 通过索引访问:``obj[index]`` | 通过名称访问:``obj.MyProp`` |
| 名称 | 在定义中使用 ``this`` 关键字,无特定名称 | 必须有明确的名称 |
| 参数 | 必须至少有一个参数 | 没有任何参数 |
| 重载 | 可以重载(只要参数类型或数量不同) | 不能重载 |