C# 索引器(Indexer)超全笔记实用指南
平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“C# 索引器(Indexer)超全笔记”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
一、索引器 核心概念
1. 什么是索引器
理解这一步时,默认情况下,自定义类的对象不能借助 [索引] 访问(只有数组、List 能够)。
索引器作用:给自定义类添加 this[参数] 特殊属性,让对象兼容 对象[索引/参数] 的方式取值、赋值。
本质:带参数的特殊属性,专门用来简化对象内部集合的访问。
2. 索引器固定语法
// 访问修饰符 返回值 this[参数]
public 返回值 this[参数类型 参数名]
{
get { 取值逻辑 }
set { 赋值逻辑,value 为传入的值 }
}
3. 核心特点
- 采用 this 关键字定义
- 兼容 get、set 访问器(可读可写/只读均可)
- 兼容重载(多个不同参数的索引器)
- 只能定义在类、结构体中
二、基础索引器:数字索引(int 参数)
业务场景
落到代码里,ClassRoom 班级内部封装学生集合,借助索引器实现 room[0] 直接拿到/修改学生对象。
完整核心代码
class ClassRoom
{
// 内部封装学生集合
public List<Student> list = new List<Student>();
// 添加学生方法
public void Add(Student stu)
{
list.Add(stu);
}
// 数字索引器:通过下标 增改查
public Student this[int index]
{
get
{
// 根据索引返回对应学生对象
return list[index];
}
set
{
// 根据索引修改集合中的元素
list[index] = value;
}
}
}
调用方式
// 完整调用测试代码
ClassRoom room = new ClassRoom();
// 添加两名学生
room.Add(new Student() { Name = "张三", Age = 10 });
room.Add(new Student() { Name = "李四", Age = 20 });
// 索引器set赋值:修改下标0的学生对象
room[0] = new Student() { Name = "王五", Age = 30 };
// 索引器get取值:读取下标0、1的学生信息
Console.WriteLine(room[0].Name + room[0].Age); // 输出:王五30
Console.WriteLine(room[1].Name + room[1].Age); // 输出:李四20
三、索引器重载(重点考点)
索引器兼容参数类型不同实现重载,一个类能够定义多个索引器!
1. 字符串索引器(按姓名查询对象)
功能:借助 room["李四"] 根据姓名匹配并得到学生对象
public Student this[string v]
{
get
{
// 模糊匹配姓名,返回对应学生对象
return list.Find(v1 => v1.Name == v);
}
}
完整调用测试(字符串索引器查询学生年龄):
// 根据姓名查询李四、王五的年龄
Console.WriteLine(room["李四"].Age); // 输出:20
Console.WriteLine(room["王五"].Age); // 输出:30
2. 对象参数索引器(根据学生对象查索引下标)
功能:借助传入学生对象,匹配姓名,得到该学生在集合中的索引位置
public int this[Student s1]
{
get
{
// 根据对象姓名匹配,返回索引值
int index = list.FindIndex(v => v.Name.Equals(s1.Name));
return index;
}
}
完整调用测试(对象索引器查询对应下标):
// 传入学生对象,获取该学生在集合中的索引位置
int index1 = room[new Student() { Name = "李四", Age = 20 }];
int index2 = room[new Student() { Name = "王五", Age = 30 }];
Console.WriteLine(index1); // 输出:1
Console.WriteLine(index2); // 输出:0
索引器重载总结
同一个类中三个索引器,参数不同、功能不同,合法重载:
- this[int index]:下标查对象、改对象
- this[string name]:姓名查对象
- this[Student stu]:对象查下标
四、进阶索引器:动态数组扩容索引器(实战练习)
业务需求
结合项目来看,封装 string 数组,自定义索引器:索引超出数组长度时,自动扩容数组同时赋值,突破普通数组固定长度限制。
完整核心代码
public class Student
{
private string[] names = new string[4];
// 只读属性,默认返回第一个元素
public string Name { get => names[0]; }
// 构造函数初始化数组
public Student(string[] s)
{
names = s;
}
// 自定义索引器:支持自动扩容
public string this[int index]
{
get
{
// 根据索引取值
return names[index];
}
set
{
// 判断索引是否超出数组长度
if (index >= names.Length)
{
// 1. 创建长度+1的新数组
string[] newArr = new string[names.Length + 1];
// 2. 拷贝原数组数据到新数组
Array.Copy(names, newArr, names.Length);
// 3. 给新索引位置赋值
newArr[index] = value;
// 4. 替换原数组,完成扩容
names = newArr;
}
else
{
// 索引合法,直接赋值
names[index] = value;
}
}
}
}
完整调用测试
// 动态扩容索引器 完整调用代码
// 初始化数组数据
Student stu = new Student(new string[] { "六一", "高考", "中考", "端午" });
// 读取默认第一个元素
Console.WriteLine(stu.Name); // 输出:六一
// 修改原有下标数据
stu[0] = "期末";
Console.WriteLine(stu[0]); // 输出:期末
Console.WriteLine(stu[1]); // 输出:高考
Console.WriteLine(stu[2]); // 输出:中考
Console.WriteLine(stu[3]); // 输出:端午
// 超出原数组长度,自动扩容赋值
stu[4] = "12";
Console.WriteLine(stu[4]); // 输出:12
扩容逻辑解析
- 初始数组长度固定为4
- 执行 stu[4] = "12" 时,索引超出范围
- 自动新建更长数组、拷贝原数据、赋值新元素、替换原数组
- 实现伪动态数组效果
五、索引器必考知识点 & 易错点
- 索引器必须用 this 定义,无方法名
- 索引器本质是带参数的属性,不是方法
- 兼容重载:参数个数、类型不同即可重载
- 能够只写 get(只读索引器),不能只写 set
- 普通类、结构体能够写索引器,静态类不能定义索引器
- value 关键字:固定接收索引器赋值时右侧的值
六、满分背诵口诀
- 索引器用this,对象括号能取值
- 本质属性带参数,get取值set赋值
- 参数不同可重载,数字字符对象皆可传
- 数组固定会越界,自定义索引可扩容
结合项目来看,总的来说,C# 索引器适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。
相关资讯
-
10.13
C#中Invoke、begininvoke、InvokeRequired三者之间的区别实用指南
-
10.13
OpenClaw飞书渠道ACP功能启动的实现方式步骤实用指南
-
10.13
C# async Task返回值的使用小结实用指南
-
10.13
认识 DeepSeek Harness(DSH):Agent、Harness 与“一切皆插件“实用指南
-
10.13
C# 索引器(Indexer)超全笔记实用指南
-
10.13
Ubuntu上Docker快速部署OpenClaw的实践教程实用指南
游戏推荐
推荐专题
热门阅读
推荐下载
-
-
下载
- |
-
-
下载
- 《行尸走肉第一章》免安装中文汉化硬盘版下载
- 单机|436 MB
- 一款以动作冒险为主题的游戏
-
-
下载
- 《街头霸王X铁拳》免安装中文汉化硬盘版下载
- 单机|111MB
- 一款非常好玩的格斗游戏
-
-
下载
- |
-
-
下载
- 《暗黑破坏神3》免安装繁体中文正式版下载
- 单机|7630 MB
- 一款以角色扮演为主题的游戏
-
-
下载
- 《马克思佩恩3》免安装硬盘版下载
- 单机|27033 MB
- 一款以第三人称射击为主题的游戏