探索高清视觉盛宴:遇见心动瞬间

核心内容摘要

XaxmantaUzunHayaUzun:一段跨越时空的诗意旅程
OV义姐:科技圈最温柔的“良妈妈”,如何在参数时代活成了用户的心头好?

肖雅婷单挑:不止于热血,更是格局与成长的史诗

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(

){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#

0 支持IAsyncEnumerableTyield returnpublicasyncIAsyncEnumerableintGetNumbersAsync(){for(inti0;i10;i){awaitTask.Delay(

;yieldreturni;}}// 使用awaitforeach(varnuminGetNumbersAsync()){Console.WriteLine(num);}

三、

总结一句话回答模板面试 30 秒版本“索引器是让类支持像数组一样使用obj\[key\]访问的语法糖本质是编译成 get_Item / set_Item 方法主要用于自定义集合的元素访问迭代器是让类支持 foreach 遍历的语法糖通过 yield return 实现本质是编译器生成一个状态机类实现 IEnumerator主要用于延迟计算和自定义遍历逻辑。

简单说索引器 自定义 [] 访问迭代器 自定义 foreach 行为。

”需要我继续补充索引器重载、接口索引器写法迭代器在 LINQ 中的作用yield return 的性能分析与状态机反编译实际项目中常见的坑告诉我我们继续深入

17.c.红桃起草-17.c.红桃起草应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123