当前位置: 首页 > news >正文

C# 索引器 this[]

前言:索引器核心定义(必背)

普通自定义类的对象,默认无法通过对象[索引]方式访问数据。

索引器是以 this 关键字定义的特殊属性,作用:给自定义类拓展对象[参数]的访问方式,让对象像数组、List 一样支持索引读写。

索引器支持重载,可以根据 数字、字符串、对象 不同参数实现不同功能。


第一段:系统 List 自带索引器演示

代码

List<int> list1 = new List<int>(); list1.Add(1); list1[0] = 100; Console.WriteLine(list1[0]); Console.WriteLine(list1.Find(v => v % 2 == 0));

逐行解析

1.List<int> list1 = new List<int>();

创建一个存储整数的泛型集合,List 内部自带官方索引器,支持下标访问。

2.list1.Add(1);

向集合添加第一个元素,此时下标 0 的值为 1。

3.list1[0] = 100;

调用 List 索引器的set 访问器,修改下标 0 的元素,覆盖原值为 100。

4.Console.WriteLine(list1[0]);

调用 List 索引器的get 访问器,读取下标 0 数据,输出:100。

5.list1.Find(v => v % 2 == 0)

Lambda 查询集合中第一个偶数,100 是偶数,输出 100。


第二段:自定义实体类 Student(基础模型)

代码

class Student { public string Name { get; set; } public int Age { get; set; } }

知识点解析

1. 标准实体类,用于封装学生数据:姓名、年龄。

2. 无索引器、无自定义方法,仅作为数据载体。

3. 后续班级集合 List<Student> 存储的就是该类的实例对象。


第三段:ClassRoom 班级类 功能需求

需求注释

//1班级类对象可以通过Add添加一个学生对象 封装Add方法实现添加学生的功能 //2需要通过 room[0]访问添加学生对象 定义这样的this[int index]属性

需求拆解

1. 封装 Add 方法:对外提供学生添加入口,隐藏内部集合操作。

2. 定义数字索引器:实现room[下标]读写学生对象。

3. 拓展重载索引器:按姓名查对象、按对象查下标。


第四段:ClassRoom 基础集合 + Add 方法

代码

class ClassRoom { public List<Student> list = new List<Student>(); public void Add( Student stu) { list.Add(stu); }

知识点解析

1.public List<Student> list

定义集合容器,专门存储所有学生对象,是整个班级的数据核心。

2.Add(Student stu)封装方法

面向对象封装思想:外部不需要操作集合,只需要调用 Add 就能添加学生,降低使用难度。


第五段:数字索引器 this[int index](核心必学)

代码

public Student this[int index] { get { return list[index]; } set { list[index] = value; } }

逐段详解

1. 索引器固定格式:返回值 this[参数类型 参数名]

2. get 访问器:触发场景room[0]读取数据

根据传入的 index 下标,返回集合中对应位置的学生对象。

3. set 访问器:触发场景room[0] = 新对象

value 代表等号右侧赋值的学生对象,直接覆盖集合原下标数据。

4. 功能:可读可写,让自定义班级类拥有数组式访问能力。


第六段:字符串重载索引器 this[string v]

代码

public Student this[string v] { get { Console.WriteLine(v+"++++++++++"); return list.Find(v1 => v1.Name == v); } }

知识点解析

1. 索引器重载规则:参数类型不同构成重载(int 索引器 VS string 索引器)。

2. 仅存在 get 访问器:只读索引器,只能查询、不能赋值。

3. 核心逻辑:使用 List.Find 方法,根据传入的姓名,匹配集合中对应学生并返回完整对象。

4. 使用方式:room["李四"]直接获取李四的学生对象。


第七段:对象重载索引器 this[Student s1]

代码

public int this[Student s1] { get { int i1 = list.FindIndex(v => v.Name.Equals(s1.Name)); return i1; } }

知识点解析

1. 参数为 Student 对象,再次构成索引器重载。

2. 功能:反向查询,传入学生对象,返回该学生在集合中的下标索引。

3.FindIndex:查询匹配元素的下标,匹配姓名一致即返回索引。

4. 使用方式:room[学生对象]获取下标数字。


第八段:Main 方法索引器实操调用解析

代码分段解析

ClassRoom room = new ClassRoom(); room.Add(new Student() { Name = "张三", Age = 10 }); room.Add(new Student() { Name = "李四", Age = 20 });

创建班级对象,添加两名学生,下标 0=张三、下标1=李四。

room[0] = new Student() { Name="王五",Age= 30 };

触发 int 索引器 set 方法,覆盖下标0,张三被替换为王五。

Console.WriteLine(room[0].Name + room[0].Age); Console.WriteLine(room[1].Name + room[1].Age);

触发 int 索引器 get 方法,读取:王五30、李四20。

Console.WriteLine(room["李四"].Age); Console.WriteLine(room["王五"].Age);

触发 string 索引器 get 方法,根据姓名查询对象并输出年龄。

Console.WriteLine(room[new Student() { Name="李四",Age=20}]);

触发 Student 对象索引器,返回李四对应的下标 1。


第九段:升级版 Student 类(数组动态扩容索引器)

完整代码

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) { string[] newArr = new string[names.Length+1]; Array.Copy(names, newArr,names.Length); newArr[index] = value; names = newArr; } else { names[index] = value; } } } }

逐段详解

1.private string[] names = new string[4];

定义固定长度为4的私有字符串数组,存储多组名称数据。

2.public string Name { get => names[0]; }

只读属性,固定返回数组第一个元素。

3. 构造方法Student(string[] s)

接收外部数组,给内部 names 数组初始化赋值。

索引器动态扩容核心逻辑

get 访问器:根据下标读取数组对应元素。

set 访问器核心(重难点)

① 判断index >= names.Length:索引超出原数组范围,需要扩容;

② 创建长度+1的新数组;

Array.Copy将旧数组所有数据拷贝到新数组;

④ 给新索引位置赋值;

⑤ 用新数组覆盖旧数组,完成动态扩容。

⑥ 若索引未越界,直接原地修改数组值。


第十段:Student 扩容索引器调用测试解析

测试代码

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]);

运行逻辑

1. 初始化数组4个元素,Name 属性输出第一个值:六一。

2.stu[0] = "期末":索引未越界,直接修改下标0数据。

3. 依次读取 0、1、2、3 下标数据。

4.stu[4] = "12":原数组最大下标3,4越界,触发动态扩容,数组长度变为5,新增下标4并赋值。


终极考点总结(必背)

1. 索引器本质:this 修饰的特殊属性,非方法。

2. 索引器支持重载:int、string、对象 不同参数可共存。

3. 有 get、set:可读可写;只有 get:只读。

4. 普通数组固定长度,自定义索引器可手动实现动态扩容

5. 索引器作用:封装内部集合,对外提供简洁的下标访问方式,符合面向对象封装特性。

http://www.rkmt.cn/news/1471039.html

相关文章:

  • 随着树木和非树木植被覆盖的扩大,全球人口暴露于城市绿地的不平等加剧
  • 从‘边缘’到‘语义’:手把手教你用TensorBoard逐层可视化ResNet的‘认知’过程(PyTorch版)
  • 保姆级教程:用ROS1在局域网内搞定两台机器人的主从通信(含rqt_graph可视化验证)
  • SpringBoot项目升级Swagger3.0后,swagger-ui.html 404?别慌,一个注解和依赖就搞定
  • HoRain云--Claude Code 开发配置
  • Meta:智能体自主发现高效混合架构
  • 告别打印插件!纯前端JS调用斑马打印机打印二维码的保姆级教程(附ZPL指令详解)
  • 安徽广告道闸服务商大揭秘,2026年05月口碑之选在此,升降柱/导轨伸缩门/电动悬浮门,广告道闸集成服务商选哪家 - 品牌推荐师
  • 别再硬写样式了!用uni-app的midButton属性5分钟搞定中间凸起TabBar(H5/小程序通用)
  • 3D高斯泼溅技术与GaussianSwap人脸交换系统解析
  • Vivado秒表进阶玩法:如何给你的FPGA计时器增加小数点显示和时分秒格式切换?
  • 网络排障不求人:手把手教你配置中兴ZXR10-3928A的端口镜像(附完整命令)
  • 2026年美国留学中介哪家好,机构排名推荐与选机构避坑全流程指南 - 环球新视野
  • 如何快速搭建虚拟显示器:Parsec VDD新手完整指南
  • 终端环境下 AI 图像识别与生成实战:从手绘草稿到精美插画的完整方案
  • 2026年驻马店青少年教育学校评测:青少年教育基地、青少年行为矫正基地、青春期休学孩子矫正学校、休学孩子疗愈基地选择指南 - 优质品牌商家
  • 2026年知名的人形机器人/机器人/送餐机器人/迎宾机器人高口碑品牌推荐 - 行业平台推荐
  • 2026年q2国内玻璃酒瓶生产厂家综合实力排行:化妆品玻璃瓶/橄榄油玻璃瓶/红酒瓶/膏霜玻璃瓶/实力盘点 - 优质品牌商家
  • 2026年质量好的PP-WAX/PVC专用蜡/EBS/FT-WAX精选推荐公司 - 品牌宣传支持者
  • 从 `ffmpeg -buildconf` 输出里,我们能解读出什么?一份FFmpeg编译配置的深度解析
  • 从V-REP 3.5到CoppeliaSim 4.9:机器人仿真软件版本变迁与老项目兼容性指南
  • 2026年专业电能质量静止无功发生器厂家top10盘点:成都电能质量静止无功发生器/实力盘点 - 优质品牌商家
  • 2026年6月煤矿安全设备厂家推荐,矿用自动洒水降尘装置用热释红外传感器,煤矿安全设备实力厂家口碑推荐 - 品牌推荐师
  • 别再手动传文件了!用Colab直接运行GitHub项目,5分钟搞定环境配置
  • PHPPHP与消息队列RabbitMQ集成
  • 2026年Q2重庆黄金回收店核心技术与服务全景解析 - 优质品牌商家
  • 告别定位漂移:用Python+开源IGNav库,手把手实现你的第一个RTK/INS紧组合算法
  • 给TMS320F28377D做个‘心脏搭桥’:手把手教你配置双工程Bootloader的CMD文件
  • 从智能车竞赛到DIY电源:固态电容如何解决我的大功率电路‘发烧’难题
  • 别再自己造轮子了!手把手教你用Cadence/Synopsys VIP加速SoC验证(附自研VIP开发避坑指南)