0

0

c# 索引器是什么

星降

星降

发布时间:2026-01-23 09:19:03

|

168人浏览过

|

来源于php中文网

原创

C#索引器是编译器生成真实方法的正式特性,本质为带参数的this属性;必须为实例成员,支持任意参数类型,用于封装访问并校验边界,不可静态或传ref/out。

c# 索引器是什么

C# 索引器就是让你的对象能像数组一样被方括号 [] 访问的机制——它不是语法糖,而是编译器生成真实方法(get_Item/set_Item)的正式语言特性。

索引器本质:带参数的 this 属性

它长得像属性,但没有名字,用 this[...] 声明;行为像方法,但调用时不用括号,直接写 obj[0]obj["key"]。关键点:

  • this 是强制关键字,不可省略或替换成其他标识符
  • 参数类型任意:支持 intstringIndexRange,甚至自定义类型
  • 不能是静态成员,必须是实例级(static this[int i] {...} ❌ 不合法)
  • 不归类为变量,所以不能传给 refout 参数

为什么用索引器而不是公开内部数组?

封装性 + 安全控制是核心动机。比如你有个温度记录类 TempRecord,内部存着 float[] temps,但你不希望用户绕过校验直接操作数组:

public class TempRecord
{
    private float[] temps = new float[24];
public float this[int hour]
{
    get
    {
        if (hour < 0 || hour >= 24)
            throw new ArgumentOutOfRangeException(nameof(hour));
        return temps[hour];
    }
    set
    {
        if (value < -100 || value > 100)
            throw new ArgumentException("温度超出合理范围");
        temps[hour] = value;
    }
}

}

这样调用 record[25] = 36.5f 就会立刻抛异常,而直接访问 record.temps[25] 可能静默越界或引发后续逻辑错误。

2088shop商城购物系统
2088shop商城购物系统

2088shop商城购物系统是商城系统中功能最全的一个版本:非会员购物、商品无限级分类、不限商品数量、商品多级会员定价、上货库存、Word在线编辑器、订单详情销售报表、商品评论、留言簿、管理员多级别、VIP积分、会员注册积分奖励、智能新闻发布、滚动公告、投票调查、背景图片颜色更换、店标上传、版权联系方式修改、背景音乐(好歌不断)、广告图片支持Flash、弹出浮动广告、搜索引擎关健词优化、图文友情联

下载

常见踩坑:重载冲突与接口实现

多个索引器共存没问题,但参数签名必须严格区分;接口中声明索引器时,显式实现容易出错:

  • 两个索引器参数类型相同但顺序不同(如 this[string, int]this[int, string])✅ 允许重载
  • 只定义 get 没有 set → 只读索引器(collection[0] = "x" 编译报错)
  • 实现接口索引器时,若类同时实现多个含同签名索引器的接口,必须用显式语法:string IEmployee.this[int i] { get; set; }
  • 别在索引器里做耗时操作(如查数据库),因为 obj[i] 看起来像普通访问,实则可能很重

支持现代 C# 特性:Index 和 Range

C# 8+ 可直接用 ^(末尾索引)和 ..(范围)语法,前提是索引器明确支持:

public string this[Index index] => words[index];
public string[] this[Range range] => words[range];

调用时就能写 sentence[^1]sentence[1..3]。注意:这依赖底层数组/集合本身支持 Index/Range,否则运行时报错,不是编译期检查。

索引器真正难的不是写法,而是想清楚“这个访问是否该暴露”以及“边界和副作用怎么兜住”——它把隐式数组访问变成了显式契约,一旦加了,就得对每次 [...] 调用负责。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

338

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

573

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

100

2025.10.23

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

182

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

283

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

255

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

121

2025.08.07

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

338

2023.08.02

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.3万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号