C#每日面试题-索引器和迭代器的区别
C# 每日面试题索引器Indexer和迭代器Iterator的区别这是 C# 中非常高频的一道面试题尤其在 .NET 中高级/资深岗位中几乎每次都会问到因为它考察了你对 C#语言特性本质、语法糖实现、使用场景以及底层机制的理解。下面从多个维度完整对比方便你快速记忆和回答。一、核心对比表面试最常用回答框架维度索引器Indexer迭代器Iterator关键区别一句话总结语法关键字this[参数]yield return / yield break—本质一种特殊的属性Property-like一种状态机生成器编译器生成的 IEnumerator属性 vs 方法生成器作用对象类/结构体/接口方法返回 IEnumerable 或 IEnumerator作用于类型 vs 作用于方法主要目的像数组一样用 [] 访问对象内部数据让对象能被 foreach 遍历自定义索引访问 vs 自定义遍历行为返回类型任意类型get 返回set 接收IEnumerable / IEnumerator / IAsyncEnumerable—是否可以有参数是可以多个参数甚至重载通常无参foreach 不传参索引器可以参数化是否可以只读/只写可以只写 get 或只写 set通常只读yield return 产生值索引器更灵活编译后真实类型编译成 get_Item / set_Item 方法编译成状态机类嵌套类 MoveNext 实现方法 vs 状态机是否支持泛型支持支持IEnumerable—典型使用场景自定义集合、字典式访问、矩阵、配置项自定义集合、延迟计算、文件逐行读取、树遍历[] 访问 vs foreach 遍历是否可以异步同步为主C# 8 支持索引器 async get支持 asyncyield return IAsyncEnumerable迭代器异步更自然性能开销几乎无直接方法调用有状态机开销但现代 JIT 优化很好索引器更轻量二、最常见的面试追问 标准回答Q1请写出索引器和迭代器的典型代码索引器示例最常见写法publicclassStringDictionary{privateDictionarystring,string_datanew();// 索引器最常见单参数形式publicstringthis[stringkey]{get_data.TryGetValue(key,outvarvalue)?value:null;set_data[key]value;}// 支持多参数索引器矩阵示例publicintthis[introw,intcol]{get/* 计算逻辑 */;set/* 计算逻辑 */;}}// 使用vardictnewStringDictionary();dict[name]张三;// 调用 set_Itemstringnamedict[name];// 调用 get_Item迭代器示例最常见两种写法// 方式1返回 IEnumerableT最常用publicIEnumerableintGetFibonacci(intcount){inta0,b1;for(inti0;icount;i){yieldreturna;inttempab;ab;btemp;}}// 方式2返回 IEnumeratorT较少见手动控制publicIEnumeratorintGetEnumerator(){yieldreturn1;yieldreturn1;yieldreturn2;yieldreturn3;// ...}// 使用foreach(varnuminGetFibonacci(10)){Console.WriteLine(num);}Q2索引器底层编译成什么迭代器底层编译成什么索引器→ 编译成两个方法public string get_Item(string key)public void set_Item(string key, string value)迭代器→ 编译器生成一个状态机类嵌套的密封类实现IEnumeratorT接口包含状态字段-1初始0开始1第一个 yield…MoveNext() 方法核心状态跳转逻辑Current 属性Dispose 方法用于 finally 块Q3什么时候用索引器什么时候用迭代器用索引器想让你的类像数组/字典一样使用obj[key]访问需要对内部集合进行封装访问类似 Dictionary、List多维索引如矩阵、表格、配置表用迭代器需要让你的类支持foreach遍历想实现延迟计算yield return 按需产生元素处理大数据量如逐行读取文件、遍历树、生成无穷序列希望代码写得更简洁避免手动实现 IEnumeratorQ4索引器和属性Property的本质区别本质相同索引器就是带参数的属性语法区别属性用.访问索引器用[]访问使用习惯属性通常表示“成员”索引器通常表示“集合中的元素”Q5C# 中支持异步迭代器的场景C# 8.0 支持IAsyncEnumerableTyield returnpublicasyncIAsyncEnumerableintGetNumbersAsync(){for(inti0;i10;i){awaitTask.Delay(100);yieldreturni;}}// 使用awaitforeach(varnuminGetNumbersAsync()){Console.WriteLine(num);}三、总结一句话回答模板面试 30 秒版本“索引器是让类支持像数组一样使用obj\[key\]访问的语法糖本质是编译成 get_Item / set_Item 方法主要用于自定义集合的元素访问迭代器是让类支持 foreach 遍历的语法糖通过 yield return 实现本质是编译器生成一个状态机类实现 IEnumerator主要用于延迟计算和自定义遍历逻辑。简单说索引器 自定义 [] 访问迭代器 自定义 foreach 行为。”需要我继续补充索引器重载、接口索引器写法迭代器在 LINQ 中的作用yield return 的性能分析与状态机反编译实际项目中常见的坑告诉我我们继续深入

相关新闻

【Django毕设全套源码+文档】基于Python的香港历史科普网站的设计与实现(丰富项目+远程调试+讲解+定制)

【Django毕设全套源码+文档】基于Python的香港历史科普网站的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/9 7:52:08 阅读更多 →
springboot大学生选课系统

springboot大学生选课系统

目录 开发技术### 系统概述技术栈核心功能创新点适用场景 源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 开发技术### 系统概述 SpringBoot大学生选课系统是基于SpringBoot框架开发的Web应用,旨在简化高校选课流程&#x…

2026/7/7 11:31:56 阅读更多 →
springboot大学生科技项目活动比赛报名系统vue

springboot大学生科技项目活动比赛报名系统vue

目录 系统概述技术栈核心功能创新点部署方案适用场景 开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 系统概述 SpringBoot大学生科技项目活动比赛报名系统是一个基于前后端分离架构的Web应用。后端采用SpringBoot框架提供RES…

2026/7/8 18:02:38 阅读更多 →

最新新闻

Linux虚拟机安装与配置全指南:从VirtualBox到Ubuntu Server实战

Linux虚拟机安装与配置全指南:从VirtualBox到Ubuntu Server实战

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在服务器运维、开发环境搭建和系统学习过程中,Linux虚拟机是绕不开的基石工具。无论是为了测试新服务、隔离开发环境&…

2026/7/9 17:33:22 阅读更多 →
AI编程助手实战测评:ChatGPT、Gemini、Claude生成足球游戏代码对比

AI编程助手实战测评:ChatGPT、Gemini、Claude生成足球游戏代码对比

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在尝试用AI辅助开发时,发现一个很有意思的挑战:让不同的主流大模型(ChatGPT、Gemini、Claude&…

2026/7/9 17:33:22 阅读更多 →
L9958与PIC18F45K42电机控制方案解析

L9958与PIC18F45K42电机控制方案解析

1. L9958与PIC18F45K42的黄金组合解析 在电机控制领域,STMicroelectronics的L9958驱动芯片与Microchip的PIC18F45K42微控制器堪称经典组合。L9958是一款多功能汽车级H桥驱动器,支持高达45V的工作电压和3A的持续输出电流,其内置的电荷泵和PWM控…

2026/7/9 17:29:17 阅读更多 →
2026年合肥 GEO 优化服务商筛选全指南 + 本地靠谱服务商推荐

2026年合肥 GEO 优化服务商筛选全指南 + 本地靠谱服务商推荐

一、合肥挑选 GEO 优化服务商核心评判标准 (一)区分 GEO 真实优化与虚假包装公司 落地案例本地化优先 优先看服务商是否有合肥本地实体行业案例(财税、美容、本地门店、装修、教育等),拒绝只拿北上广大企业案例、无合肥…

2026/7/9 17:29:17 阅读更多 →
支持定制的许可证管理方案,满足企业个性化需求

支持定制的许可证管理方案,满足企业个性化需求

过去十几年,企业软件资产管理的重心一直在从"有没有管"向"管得好不好"转移。随着研发型组织规模扩大、IT架构混合化,标准化的盒子产品越来越难匹配复杂的业务场景——不同部门对许可池的争夺规则不同、跨区域子公司的合规口径不同、…

2026/7/9 17:27:17 阅读更多 →
从零实现C++哈希表:深入理解unordered_map与unordered_set底层原理

从零实现C++哈希表:深入理解unordered_map与unordered_set底层原理

1. 项目概述:为什么要自己动手写一个unordered_map和set?如果你是一个C开发者,无论是正在准备面试,还是想深入理解STL容器的精髓,自己动手实现一遍unordered_map和set(这里特指基于哈希表的无序版本&#x…

2026/7/9 17:25:16 阅读更多 →

日新闻

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 还在为Foobar2000找不到高质…

2026/7/9 0:01:04 阅读更多 →
ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍 【免费下载链接】ElegantBook Elegant LaTeX Template for Books 项目地址: https://gitcode.com/gh_mirrors/el/ElegantBook 你是否曾经为学术书籍的封面设计而烦恼?想要一个既专业又美观的封…

2026/7/9 0:03:06 阅读更多 →
如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南 【免费下载链接】pyodbc Python ODBC bridge 项目地址: https://gitcode.com/gh_mirrors/py/pyodbc 在当今数据驱动的商业环境中,企业级数据库连接已成为现代应用开发的核心需求。pyodbc作为一款强大…

2026/7/9 0:07:11 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻