C#怎么使用索引器?自定义索引器语法详解教程

来源:站长平台作者:重启一下头衔:草根站长
导读:本期聚焦于小伙伴创作的《C#怎么使用索引器?自定义索引器语法详解教程》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#怎么使用索引器?自定义索引器语法详解教程》有用,将其分享出去将是对创作者最好的鼓励。

C#索引器是类或结构的一种特殊成员,它让实例可以像数组一样通过方括号加索引的方式访问内部存储的元素,不需要额外调用方法就能完成取值和赋值操作,非常适合封装内部集合或自定义数据容器的场景。

C#怎么使用索引器?自定义索引器语法详解教程

C#索引器的基本语法

索引器的定义和属性类似,但是没有名称,使用this关键字作为标识,后面跟着方括号包裹的索引参数。基本语法结构如下:

// 索引器基本语法
访问修饰符 返回值类型 this[索引参数类型 索引参数名]
{
    get
    {
        // 根据索引返回对应的值
    }
    set
    {
        // 根据索引设置对应的值,value是隐式参数
    }
}

索引器可以只有get访问器(只读索引器),也可以只有set访问器(只写索引器),和属性的访问器规则一致。

自定义索引器实现示例

下面通过一个自定义的整数列表类来演示如何实现自定义索引器,这个类内部用数组存储数据,对外提供索引访问能力:

using System;

namespace IndexerDemo
{
    // 自定义整数列表类
    public class MyIntList
    {
        // 内部存储数组
        private int[] _data;
        // 数组实际存储的元素数量
        private int _count;

        // 构造函数,初始化容量
        public MyIntList(int capacity)
        {
            _data = new int[capacity];
            _count = 0;
        }

        // 添加元素的方法
        public void Add(int item)
        {
            if (_count >= _data.Length)
            {
                // 容量不足时扩容,这里简单处理为抛出异常
                throw new InvalidOperationException("列表容量已满");
            }
            _data[_count] = item;
            _count++;
        }

        // 自定义索引器,索引为int类型,返回int类型
        public int this[int index]
        {
            get
            {
                // 索引校验
                if (index < 0 || index >= _count)
                {
                    throw new IndexOutOfRangeException("索引超出范围");
                }
                return _data[index];
            }
            set
            {
                if (index < 0 || index >= _count)
                {
                    throw new IndexOutOfRangeException("索引超出范围");
                }
                _data[index] = value;
            }
        }

        // 获取当前元素数量
        public int Count
        {
            get { return _count; }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyIntList list = new MyIntList(5);
            list.Add(10);
            list.Add(20);
            list.Add(30);

            // 使用索引器取值
            Console.WriteLine(list[0]); // 输出10
            Console.WriteLine(list[1]); // 输出20

            // 使用索引器赋值
            list[2] = 35;
            Console.WriteLine(list[2]); // 输出35

            // 遍历所有元素
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine($"索引{i}的值:{list[i]}");
            }
        }
    }
}

索引器的进阶用法

索引器重载

和普通方法一样,索引器也支持重载,只要参数列表的类型或数量不同即可。比如我们可以给上面的MyIntList类添加一个字符串类型的索引器,通过元素值查找对应的索引:

// 重载索引器,参数为string类型,返回int类型(元素值对应的索引)
public int this[string itemValue]
{
    get
    {
        for (int i = 0; i < _count; i++)
        {
            if (_data[i].ToString() == itemValue)
            {
                return i;
            }
        }
        return -1; // 没找到返回-1
    }
}

使用时可以直接通过字符串值查找索引:

// 调用重载的索引器
int index = list["20"];
Console.WriteLine(index); // 输出1

在接口中定义索引器

索引器也可以在接口中声明,实现该接口的类必须实现对应的索引器。示例如下:

// 定义包含索引器的接口
public interface IMyCollection<T>
{
    T this[int index] { get; set; }
    int Count { get; }
}

// 实现接口的类
public class MyStringCollection : IMyCollection<string>
{
    private string[] _items;
    private int _count;

    public MyStringCollection(int capacity)
    {
        _items = new string[capacity];
        _count = 0;
    }

    public void Add(string item)
    {
        if (_count >= _items.Length)
        {
            throw new InvalidOperationException("容量已满");
        }
        _items[_count] = item;
        _count++;
    }

    // 实现接口的索引器
    public string this[int index]
    {
        get
        {
            if (index < 0 || index >= _count)
            {
                throw new IndexOutOfRangeException();
            }
            return _items[index];
        }
        set
        {
            if (index < 0 || index >= _count)
            {
                throw new IndexOutOfRangeException();
            }
            _items[index] = value;
        }
    }

    public int Count
    {
        get { return _count; }
    }
}

索引器的使用注意事项

  • 索引器的参数类型不限于int,可以是任意类型,比如string、自定义类等,只要符合重载规则即可。
  • 索引器不能作为ref或out参数传递,这是和数组索引的区别之一。
  • 索引器内部一定要做索引合法性校验,避免访问越界导致程序异常。
  • 如果类内部没有存储集合结构,不建议强行实现索引器,避免造成语义混淆。

合理使用索引器可以让自定义类的使用方式更符合开发者的直觉,尤其是封装集合类、配置类、缓存类等场景时,索引器能大幅简化调用方的代码逻辑。

C#索引器自定义索引器Indexer索引器语法修改时间:2026-07-16 14:03:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。