C#索引器详解:让对象像数组一样被访问
索引器是C#中一个强大而实用的特性,它允许我们像访问数组一样访问类的成员。本文将全面介绍索引器的概念、语法、实现方式以及实际应用场景。
索引器基础概念
索引器(Indexer)是一组get和set访问器,与属性类似,但有以下关键区别:
- 访问方式:索引器使用索引运算符[]而非点运算符.来访问
- 数据表示:属性通常表示单个数据成员,而索引器通常表示多个数据成员
- 参数要求:索引器必须至少有一个参数,而属性不需要参数
索引器的核心优势在于提供了一种更直观、更数组化的方式来访问对象的内部数据,特别是在处理包含多个相似数据成员的对象时。
索引器声明语法
声明索引器的基本语法如下:
public 返回类型 this[参数类型 参数名]
{get { /* 获取逻辑 */ }set { /* 设置逻辑 */ }
}
关键点:
- 使用this关键字代替名称
- 参数列表在方括号中
- 必须至少有一个参数
- 可以只有get或set,也可以两者都有
索引器实现详解
set访问器工作原理
当对索引器赋值时,set访问器被调用:
隐式参数value包含要赋的值
索引参数决定数据存储位置
set {switch(index) {case 0: LastName = value; break;case 1: FirstName = value; break;// ...}
}
get访问器工作原理
当从索引器取值时,get访问器被调用:
- 索引参数决定返回哪个值
- 必须返回与索引器声明类型匹配的值
get {return index switch {0 => LastName,1 => FirstName,_ => throw new ArgumentOutOfRangeException()};
}
实际应用示例
Employee类索引器实现
public class Employee
{public string LastName;public string FirstName;public string CityOfBirth;public string this[int index]{get => index switch {0 => LastName,1 => FirstName,2 => CityOfBirth,_ => throw new ArgumentOutOfRangeException(nameof(index))};set {switch(index) {case 0: LastName = value; break;case 1: FirstName = value; break;case 2: CityOfBirth = value; break;default: throw new ArgumentOutOfRangeException(nameof(index));}}}
}
使用方式:
var emp = new Employee();
emp[0] = "张"; // 设置LastName
emp[1] = "三"; // 设置FirstName
Console.WriteLine(emp[0]); // 输出LastName
温度记录类示例
public class TemperatureRecord
{private readonly float[] temps = new float[24];public float this[int hour]{get => hour switch {>= 0 and < 24 => temps[hour],_ => throw new ArgumentOutOfRangeException(nameof(hour))};set {if (hour is >= 0 and < 24)temps[hour] = value;else throw new ArgumentOutOfRangeException(nameof(hour));}}
}
高级特性:索引器重载
类可以包含多个索引器,只要它们的参数列表不同:
public class MultiIndexer
{private string[,] data = new string[10,10];// 单参数索引器 public string this[int row] {get => data[row, 0];set => data[row, 0] = value;}// 双参数索引器 public string this[int row, int col] {get => data[row, col];set => data[row, col] = value;}// 字符串参数索引器 public int this[string name] {get => Array.FindIndex(data, x => x == name);}
}
索引器使用注意事项
- 性能考虑:频繁使用的索引器应保持简单,避免复杂逻辑
- 参数验证:始终验证索引参数的有效性
- 异常处理:对无效索引应抛出ArgumentOutOfRangeException
- 不可滥用:仅在确实需要数组式访问时使用,否则使用属性更合适
- 静态限制:索引器不能声明为static,必须是实例成员
索引器与属性的对比
特性 | 索引器 | 属性 |
---|---|---|
访问方式 | obj[index] | obj.Property |
参数 | 必须至少一个 | 无参数 |
名称 | 使用this | 自定义名称 |
典型用途 | 访问多个相关数据项 | 访问单个数据项 |
静态 | 不能是static | 可以是static |
总结
C#索引器是一种强大的语言特性,它:
- 使对象能够像数组一样被访问
- 提高了代码的可读性和简洁性
- 支持重载,提供多种访问方式
- 需要合理设计参数和访问逻辑
在实际开发中,索引器特别适用于集合类、矩阵类、配置类等需要按索引或键访问的场景。正确使用索引器可以显著提升代码的表达力和易用性。
相关文章:
C#索引器详解:让对象像数组一样被访问
索引器是C#中一个强大而实用的特性,它允许我们像访问数组一样访问类的成员。本文将全面介绍索引器的概念、语法、实现方式以及实际应用场景。 索引器基础概念 索引器(Indexer)是一组get和set访问器,与属性类似,但有以…...
机器学习课设
🎓 图像处理课程设计任务书 课程名称: 图像处理与模式识别 课设题目: 基于手工特征提取与传统机器学习方法的图像分类系统实现 一、课设目的 本课程设计旨在加深对图像处理与分类算法的理解,提升图像特征提取、传统机器学习模…...
vue 如何对 div 标签 设置assets内本地背景图片
在 Vue 中为 <div> 设置 assets 目录下的本地背景图片,需要通过 Webpack 或 Vite 等构建工具 处理路径引用。以下是详细实现方法: 一、项目结构说明 假设你的项目结构如下: src/assets/images/bg.jpg # 背景图片components/…...
wsl2 docker重启后没了
参考这篇文章:wsl2 docker重启后没了_mob64ca12f55920的技术博客_51CTO博客...
ubuntu 22.04 配置静态IP、网关、DNS
1、打开配置文件 vi /etc/netplan/00-installer-config.yaml 2、修改文件内容 # This is the network config written by subiquity network:ethernets:ens33:dhcp4: false # 禁用 dhcpaddresses:- 192.168.12.15/24 # 静态IProutes:- to: defaultvia: 192.168.12.254 …...

RDS PostgreSQL手动删除副本集群副本的步骤
由于PostgreSQL不支持直接删除副本集群,而是需要先将副本集群升级到主实例(区域集群),然后在逐一将写入器实例删除,然后才可以删除副本集群 查看现有的主从实例集群 将副本集群提升到区域集群 选择副本集群–>操作–>提升 提升只读副本…...

MySQL 自增主键重置详解:保持 ID 连续性
目录 前言正文 前言 爬虫神器,无代码爬取,就来:bright.cn Java基本知识: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新)…...
Vue Hook Store 设计模式最佳实践指南
Vue Hook Store 设计模式最佳实践指南 一、引言 在 Vue 3 组合式 API 与 TypeScript 普及的背景下,Hook Store 设计模式应运而生,它结合了 Vue 组合式 API 的灵活性与状态管理的最佳实践,为开发者提供了一种轻量级、可测试且易于维护的状态…...

国产化Word处理控件Spire.Doc教程:通过Java简单快速的将 HTML 转换为 PDF
在处理 HTML 文件时,你可能会发现它们在不同的浏览器和屏幕尺寸下的显示效果并不一致。而将 HTML 转换为 PDF 则可以有效地保留其布局和格式,从而确保内容在不同设备和平台上的呈现保持一致。本文将介绍如何在 Spire.Doc for Java 的帮助下通过 Java 将 …...
Spring AI 1.0 GA深度解析与最佳实践
随着人工智能技术的快速发展,Spring AI 1.0 GA 的发布标志着 Spring 生态在 AI 领域迈出了重要一步。本文将从原理、全景架构设计、最佳实践、性能测试对比等维度,全面解析如何基于 Spring AI 构建企业级 AI 应用,并以接入 DeepSeek 大模型为…...
Java求职面试:从Spring到微服务的技术挑战
Java求职面试:从Spring到微服务的技术挑战 在这个故事中,我们将进入一个模拟的互联网大厂Java求职者面试现场。面试官严肃而专业,而求职者谢飞机则以其幽默和捉摸不透的回答,让面试过程充满了趣味。 第一轮:基础框架…...
鸿蒙OSUniApp 开发的图文混排展示组件#三方框架 #Uniapp
使用 UniApp 开发的图文混排展示组件 在移动应用开发中,图文混排展示是资讯、社区、电商、教育等场景中极为常见的需求。一个灵活、美观的图文混排组件,不仅能提升内容的可读性,还能增强用户的视觉体验。随着 HarmonyOS(鸿蒙&…...
WHAT - 学习 WebSocket 实时 Web 开发
文章目录 一、基础知识了解1. WebSocket 是什么?2. 它的优势: 二、基本工作流程三、快速体验:使用原生 WebSocket客户端(浏览器端 JS):服务端(Node.js 示例,使用 ws 库) …...

5G NTN卫星通信发展现状(截止2025年3月)
今天咱们用实实在在的数据唠唠卫星通信这事儿—这些数字可比科幻片还刺激,直接告诉你这玩意儿现在有多火,未来能有多野! 先甩个大数字:截至2025年3月,全球已经有143个运营商和卫星厂商的合作项目,覆盖53个国…...

【计算机网络】第2章:应用层—DNS
目录 一、PPT 二、总结 DNS(域名系统)详解 (一)DNS核心概念 (二)DNS查询过程(重点❗) (三)DNS资源记录(RR)类型…...

[Linux]虚拟地址到物理地址的转化
[Linux]虚拟地址到物理地址的转化 水墨不写bug 文章目录 一、再次认识地址空间二、页表1、页表的结构设计2、页表节省了空间,省在哪里?3、页表的物理实现 一、再次认识地址空间 OS和磁盘交互的内存基本单位是4KB,这4KB通常被称为内存块。OS对…...

Linux线程入门
目录 Linux线程概念 什么是线程 重新理解进程 线程的优点 线程的缺点 线程的异常 线程用途 Linux线程概念 什么是线程 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至…...

Kubernetes超详细教程,一篇文章帮助你从零开始学习k8s,从入门到实战
k8s 概述 k8s github地址:https://github.com/kubernetes/kubernetes 官方文档:https://kubernetes.io/zh-cn/docs/home/ k8s,全程是 kubernetes,这个名字源于希腊语,意为"舵手"或"飞行员” k8s 这…...
Docker基础 -- Ubuntu 22.04 AArch64 交叉编译 Docker 镜像构建指南
Ubuntu 22.04 AArch64 交叉编译 Docker 镜像构建指南 作者: (填写作者) 发布日期: 2025‑05‑26 1 背景与目标 在企业内网(需要代理)环境下,我们需要一套可靠、可复用的 Ubuntu 22.04 交叉编…...
【Elasticsearch】使用脚本删除索引中的某个字段
在 Elasticsearch 中,删除索引中的某个字段可以通过以下几种方式实现,具体取决于你的需求和场景。以下是几种常见的方法: 方法 1:使用 _update_by_query API 删除字段 _update_by_query API 可以对索引中的文档执行批量更新操作&…...

OpenHarmony平台驱动使用(二),CLOCK
OpenHarmony平台驱动使用(二) CLOCK 概述 功能简介 CLOCK,时钟是系统各个部件运行的基础,以CPU时钟举例,CPU 时钟是指 CPU 内部的时钟发生器,它以频率的形式工作,用来同步和控制 CPU 内部的各…...

我们是如何为 ES|QL 重建自动补全功能的
作者:来自 Elastic Drew Tate Elasticsearch 拥有许多新功能,可以帮助你根据使用场景构建最佳搜索方案。浏览我们的示例笔记本了解更多内容,开始免费试用云服务,或者立即在本地机器上尝试 Elastic。 对于我们开发者来说࿰…...
Keepalived 配置 VIP 的核心步骤
Keepalived 配置 VIP 的核心步骤主要涉及安装软件、主备节点配置及服务管理。以下是具体操作指南: 一、安装 Keepalived Ubuntu/Debian 系统 sudo apt update sudo apt install keepalived CentOS/RHEL 系统 sudo yum install keepalived 注:需确保已配置 EPE…...
如何使用 Redis 快速实现排行榜?
Redis 的 Sorted Set(有序集合) 是实现排行榜的高效工具,其天然支持按分数排序、范围查询和原子操作。以下是快速实现排行榜的步骤和核心方案: 一、核心数据结构:Sorted Set 特性: 每个成员(me…...

MATLAB在逐渐被Python淘汰吗
MATLAB在学术研究、工程仿真、数值计算等传统领域仍占据一席之地,但Python因其开源免费、生态丰富、易于集成的优势,正在快速崛起,逐步蚕食MATLAB的市场份额。尤其在人工智能、数据分析和科学计算等领域,Python的优势愈发明显。例…...

Git 使用规范
Git 使用规范 一、版本控制的核心原则 🧭二、分支策略(Branch Strategy) 🌿2.1 分支类型与命名规范2.2 可视化流程图 三、提交信息规范(Commit Message)✍️3.1 提交格式3.2 Type 类型说明 四、Tag 版本规范…...

代码随想录第43天:图论4(最小生成树、拓扑排序)
一、冗余的边II(Kamacoder 109) from collections import defaultdict# 并查集 - 查找根节点(路径压缩) def find(fa, x):if fa[x] ! x:fa[x] find(fa, fa[x])return fa[x]# 并查集 - 合并两个集合,返回是否合并成功 …...

AI智能体|扣子(Coze)搭建【自动生成超高质量PPT】工作流
各位好久不见,你的失踪人口又回来了,已经超过一周的时间没有进行文章的更新了。 没更新的这段时间,主要还是因为工作上的调整以及身体生病所导致的停更,具体以后再说。 我们先讲今天的主要主题,使用 Coze 智能体一键生…...
list.sort(*, key=None, reverse=False)的两个问题
在python官网中,5.1. More on Lists,list.sort()是关于排序的方法。 list.sort(*, keyNone, reverseFalse) 中有两个问题: * 是什么意思key有什么作用 * 是什么意思 * 表示后面必须是关键字参数,具体见python官网4…...

文档处理的相关工具
目前网页端的文档,可以通过沉浸式翻译来进行翻译阅读和学习。 但是某些文献只有pdf下载的版本,所以需要一个免费的针对pdf的翻译工具。 保留公式和图片格式。 推荐一个pdf翻译的工具,可以自己部署使用。如果需要word版本,后面讨论…...