csharp:索引器

C# 索引器 (Indexer)

索引器(Indexer) 是 C# 中的一种特殊成员,它允许你像访问数组一样,通过下标(索引)来访问类或结构体中的数据。

简单来说,索引器就是让对象“伪装”成一个数组

为什么要使用索引器?

  • 无索引器时:如果一个类包含一组数据(例如学生列表),想要获取特定数据,通常需要定义显式的方法,如 `GetStudent(0)`。
  • 有索引器时:可以直接使用对象实例加上方括号 `[]` 来访问,代码更加直观、简洁。

主要特点:

  1. 使用 ``this`` 关键字定义。
  2. 参数不仅限于整数(``int``),可以使用任意类型(如字符串)。
  3. 本质上是一组 ``get`` 和 ``set`` 访问器。

索引器的定义格式如下:

[访问修饰符] [返回类型] 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`` 关键字,无特定名称 必须有明确的名称
参数 必须至少有一个参数 没有任何参数
重载 可以重载(只要参数类型或数量不同) 不能重载
  • 直观性:让集合类的对象使用起来更自然。
  • 封装性:隐藏了内部数据存储的细节(无论是数组、链表还是数据库)。
  • 安全性:可以在 ``get/set`` 中加入逻辑判断,防止非法访问。
请输入您的评论. 可以使用维基语法:
 

该主题尚不存在

您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。

  • csharp/索引器.txt
  • 最后更改: 2025/11/28 10:49
  • 张叶安