C# 2.0 新特性之迭代器, Yield Return

Unity3D之迭代器 介绍:迭代器是 C# 2.0 中的新功能。迭代器是方法、get 访问器或运算符,它使您能够在类或结构中支持 foreach 迭代,而不必实现整个 IEnumerable 接口。您只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代器时,它将自动生成IEnumerable 或 IEnumerable 接口的 Current、MoveNext 和 Dispose 方法。 迭代器 阅读详情

本文摘自:http://www.cnblogs.com/montaque/archive/2005/04/21/142844.html

C# 2.0 可能讨论比较多的是泛型, 其次可能就是迭代器,匿名方法了. 这两个特性其实有些本质上的不同, 泛型, 是相对1.1微软在 IL 上面又添加了一些指令来实现. 而迭代器则是在编译器这个层次去实现的,也就是说C# 2.0 中的迭代器的特性并没有靠引入IL来实现. 什么是迭代器呢,我拿一个例子来说明. 比如我们一下一段代码list 一个特定目录下面的所有文件, 代码可能会这么写.

public class C1IterationDemo:IEnumerable,IEnumerator { IEnumerable 成员#region IEnumerable 成员 public IEnumerator GetEnumerator() { return this; } #endregion IEnumerator 成员#region IEnumerator 成员 int curIndex=-1; public void Reset() { curIndex=-1; } public object Current { get { if(curIndex < this.allFiles.Count) { return this.allFiles[curIndex]; } throw new Exception("f"); } } public bool MoveNext() { if(this.allFiles.Count==0) return false; curIndex+=1; if(curIndex==this.allFiles.Count) { return false; } return true; } #endregion private System.Collections.Specialized.StringCollection allFiles=null; public C1IterationDemo GetFiles(string dirPath) { allFiles=new System.Collections.Specialized.StringCollection(); allFiles.Clear(); foreach(string f in System.IO.Directory.GetFiles(dirPath)) { allFiles.Add(f); } return this; } }
一下是调用:
C1IterationDemo c = new C1IterationDemo().GetFiles( " C:\\WUTemp " ); foreach ( string s in c) { Console.WriteLine(s); }
其中这里foreach 就是调用了IEnumerator的movelast, 类似 foreach 这样的调用方式,一般就是一个迭代器. 如果要你去实现类似的代码的话,可能也大通小异, 另外,我们枚举文件的时候还没有考虑子目录的情况. 类似的代码我们用C# 2.0 的话就变得很简单很简单,我一并考虑了子目录的情况.
public class FileUtility { public static IEnumerable<String> GetFiles(string dir) { foreach(String file in System.IO.Directory.GetFiles(dir)) { yield return file; } foreach (string dir1 in System.IO.Directory.GetDirectories(dir)) { foreach(string ff in System.IO.Directory.GetFiles(dir1)) { yield return ff; } } } }
调用
foreach (String f in FileUtility.GetFiles( " c:\\wutemp " )) { System.Diagnostics.Debug.WriteLine(f); }

对比一下代码,后面的代码可能有几个特点: 1。代码很简洁。其实这里多了一个yield return 语句,由于yield return 并不对应多余的il指令。所以编译器就会在编译的时候,生成一个实现Ienumator接口的类.并且自动维护该类的状态.比如movenext, 2. 使用yield return 很容易实现递归调用中的迭代器. 如果以上的问题,不使用yield return的话,可想而知.要么你先把所有的结果暂时放到一个对象集合中. 可是这样就以为着在迭代之前一定要计算号. 要么可能你的movenext 就相当的复杂了. .NET 编译生成的代码其实利用了state machine. 代码量也很大. 类似迭代的调用,比如二叉树遍历 用yield return 就很方便了.另外还有常说的pipeline模式也很方便了. 可是yield return 还是有一些缺陷. 比如如果GetFiles 有一个参数是ref 或者 out, 那这个state machine就很难去维护状态了. 事实上,yield return那是不支持方法带有ref或者out参数的情况.

more information,please refer:

Iterations with c2: http://www.theserverside.net/articles/showarticle.tss?id=IteratorsWithC2

使用匿名方法、迭代程序和局部类来创建优雅的代码: http://www.microsoft.com/china/msdn/library/langtool/vcsharp/CreElegCodAnymMeth.mspx

C#中yield return的5大核心优势:为什么90%的开发者忽视了这些陷阱? 摘要: 本文深入解析C#的yield return机制,通过对比传统集合处理方式,揭示其惰性计算、内存高效和代码简洁的核心优势。文章详细剖析状态机原理,并给出5大实战场景:大数据流式处理、LINQ集成、复杂逻辑嵌套等。同时指出3大常见陷阱(闭包捕获、资源泄漏、多线程风险),提供解决方案。掌握yield return可显著提升代码性能与可维护性,是C#开发者的必备技能。(149字) 阅读详情

相关推荐

C#迭代器效率翻倍:3大yield技巧让代码更优雅!你还在用传统方式吗?

摘要: 本文深入解析C#中yield关键字的三大核心技巧(按需生成、精准终止、异步迭代),通过5个实战案例(大数据处理、实时过滤、无限序列等)展示其性能优势,如内存占用降低90%、响应速度提升10倍。同时提供4个高频避坑指南,对比Java/Python的迭代方案,揭示yield如何以延迟执行和代码简化成为C#迭代器的"终极武器"。 关键数据: 内存优化:1GB→10MB(案例1) 异步性能:延迟从500ms→100ms(异步迭代) 开发者效率提升3倍(减少80%冗余代码) 适用场景: 大

java专栏 947

C# yield return详解。

这种代码有个很大的错误就是,我们明明只需要1000条数据,它却创建了一百万条数据,极大的浪费了内存。返回的并不是数据,而是数据的迭代。通过多次叠加,其实循环遍历的结果,就是迭代器的集合。这个方法,他会先走循环,然后根据循环体需求,去创建数据。关键字就只创建出来了1000条数据,大大的节省了内存开销。假如一个集合中有一百万条数据,我们只想要前1000条。返回的对象是不会被立即创建的,有点懒加载的意思。类型,除非数据必须使用,不然。拿到画线的地址,执行如下命令。Benchmark只能在。通过运行代码可以看到,

csdn2990的博客 2071

C#编程中的匿名方法与迭代器的精妙应用

本文深入探讨了C#编程语言中的匿名方法和迭代器的特性及其应用。通过实例分析了匿名方法如何简化事件处理代码,以及迭代器如何简化枚举器的实现并提供优雅的方式来控制集合的枚举过程。...

weixin_31688273的博客 822

C#迭代器

迭代器包含迭代器快的方法或属性。迭代器块本质是包含yield return或yield break语句的代码,只能用于以下返回类型的方法或属性: IEnumerable IEnumerable IEnumerator IEnumerator 根据返回类型,每个迭代器都有一个生成类型(yield type)。如果返回类型是非泛型接口,那么生成类型是object;如果返回类型是泛型接口,那么生成类型是该泛型接口实参的类型,比如IEnumerator的返回类型是string。 简单的实例 yield return

bwabdbkjdbkjwabd的博客 1684

C#使用yield关键字构建迭代器详解

主要为大家详细介绍了C#使用yield关键字构建迭代器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

C#中yield return用法分析

主要介绍了C#中yield return用法,对比使用yield return与不使用yield return的流程,更直观的分析了yield return的用法,需要的朋友可以参考下

知识点 - C#2.0新特性之迭代器, Yield Return

引子:http://www.cnblogs.com/yank/archive/2011/07/02/2096240.html Yield介绍 yield关键字向编译器指示它所在的方法是迭代器块。 在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供一个返回值,例如,在 foreach 语句的每一次循环中返回的值。yield 关键字也可与 break 结合使用...

weixin_30932215的博客 184

UniApp X 网络请求避坑指南:从 JS 到 UTS 的 JSON 数据处理全解析

摘要:UniAppX开发中处理JSON数据时,UTS强类型特性要求开发者改变JS习惯。本文对比两种主流方案:1)UTSJSONObject通过keypath访问数据,兼容JS但缺乏类型提示;2)type+泛型方案,通过定义数据类型实现强类型校验和智能提示,推荐用于固定数据结构。文章详细演示了两种方式的具体实现、转换方法及实战案例,并提供了类型定义技巧和注意事项,帮助开发者编写更稳定高效的跨平台应用。

归梦工作室 2789

了解 C# foreach 内部语句和使用 yield 实现的自定义迭代器

在本期专栏中,我将介绍我们在编程时经常用到的 C# 核心构造(即 foreach 语句)的内部工作原理。了解 foreach 内部行为后,便可以探索如何使用 yield 语句实现 foreach 集合接口,我将对此进行介绍。 虽然 foreach 语句编码起来很容易,但很少有开发者了解它的内部工作原理,这让我感到非常惊讶。例如,你是否注意到 foreach 对数组的运行方式不同于 IEnum

dotNET跨平台 986

LayaBox CommandBuffer描边使用详细

项目需要使用LayaBox做一个给3D物体动态描边的一个功能,前前后后踩了一些坑算是把这个东西给做出来了把我改好的代码贴上,分享给大家。 (1)想要使用描边你的引擎版本必须 >=2.9.0 (2)你必须下载 Laya官方的BlurShader库才能使用这个功能,下载地址:https://github.com/layabox/layaair-demo/tree/master/h5/3d/ts/LayaAir3D_PostProcess/BlurShader 下载完之后把BlurShader放到自己项目的

小智队长 1734

荔枝派Lichee Nano全志F1C100s烧录避坑指南:从Fel模式到SPI Flash完整流程

本文详细介绍了荔枝派Lichee Nano基于全志F1C100s芯片的SPI Flash烧录完整流程,从FEL模式进入技巧到定制化sunxi-tools编译,再到分区策略与实战烧录步骤。针对开发者常见的烧录程序问题提供了专业解决方案,帮助用户高效完成嵌入式系统部署。

tea88的博客 788

C# 传统遍历与迭代器

引言:  在C# 1.0中我们经常使用foreach来遍历一个集合中的元素,然而一个类型要能够使用foreach关键字来对其进行遍历必须实现IEnumerable或IEnumerable接口,(之所以来必须要实现IEnumerable这个接口,是因为foreach是迭代语句,要使用foreach必须要有一个迭代器才行的,然而IEnumerable接口中就有IEnumerator GetEnumera

cjolj的专栏 8486

Zabbix故障排查10051端口无法启动:zabbix-server.service: main process exited, code=exited, status=1/FAILURE

zabbix-server.service: main process exited, code=exited, status=1/FAILURE报错说与数据库失去连接。

" DevOps菜鸟(Xu JieHao)" 的博客 2255

C# 3.0设计模式

<b style="mso-bidi-font-weight:normal"><span lang="EN-US" style="font-size:42.0pt;mso-bidi-font-size:10.0pt;font-family:隶书">C# 3.0设计模式<span lang="EN-US" style="font-size:42.0pt;mso-bidi-font-size:

华章IT官方博客 3201

STM32F407+LAN8720网口不通?别慌,手把手教你用CubeMX和HAL库搞定RMII配置与调试

本文详细介绍了STM32F407与LAN8720网口不通的全面排查与解决方法,涵盖硬件检查、CubeMX配置、PHY芯片初始化和LWIP协议栈优化。通过RMII接口配置、时钟树设置和PHY芯片调试,帮助开发者快速定位并解决网络连接问题,提升嵌入式网络开发效率。

weixin_30457551的博客 506

Python爬虫实战:5分钟搞定微信公众号文章阅读数、点赞数抓取(附完整代码)

本文详细介绍了如何通过Python爬虫技术自动化抓取微信公众号文章的阅读数和点赞数。文章从数据源分析入手,分步讲解了获取文章列表与提取单篇统计数据的完整流程,并提供了应对平台风控的策略与工程化整合方案,帮助开发者高效、合规地完成数据采集任务。

ansible6ops的博客 1336

迭代器

实现一个迭代器必须实现IEnumerator 01.传统方式来实现自定义的迭代器 using System; using System.Collections; using System.Net.NetworkInformation; using static System.Console; namespace Interpreter { class Program { ...

weixin_33950757的博客 143

【WRF数据准备】生成 LCZ 对应的FRC_URB2D

WRF 静态地理数据准备

WW、forever的博客 408

C#2.0新特性—迭代器

迭代器是 C# 2.0 中的新功能。迭代器是方法、get 访问器或运算符,它使您能够在类或结构中支持 foreach 迭代,而不必实现整个 IEnumerable 接口。您只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代器时,它将自动生成 IEnumerable 或 IEnumerable 接口的 Current、MoveNext 和 Dispose 方法。  一、迭代器概述1、

junmail的专栏 770

【TC3xx芯片】TC3xx DMA模块详解

TC3xx DMA模块详解

qq_36056498的博客 5916

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C#2.0简介

C# 2.0引入了很多语言扩展,最重要的就是泛型(Generics)、匿名方法(Anonymous Methods)、迭代器(Iterators)和不完全类型(Partial Types)。• 泛型允许类、结构、接口、委托和方法通过它们所存贮和操作的数据的类型来参数化。泛型是很有用的,因为它提供了更为强大的编译期间类型检查,需要更少的数据类型之间的显式转换,并且减少了对装箱操作的需要和运行时的类型

fzzf 734

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

第1节 C#2.0新特性之四:迭代器

  迭代器        迭代器是一种方法、get 访问器或运算符,它通过使用 yield 关键字对数组或集合类执行自定义迭代。yield 返回语句会导致源序列中的元素在访问源序列中的下一个元素之前立即返回给调用方。尽管您以方法的形式编写迭代器,但编译器会将其转换为一个实际上是状态机的嵌套类。只要客户端代码中的 foreach 循环继续进行,此类就会跟踪迭代器的位置。 

powersea2的专栏 297

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

c#中yield的用法详解

一. yield是c#2.0以后为了简化迭代器加入的一个新特性。 yield 关键字只允许出现在在迭代器块中,有两种用法: 1. yield return ;   这是一个隐式转换的返回值,将计算 expression 并将结果以值的形式返回给枚举器对象。expression 必须可以隐式转换为 yield 类型的迭代器,且必须为IEnumerable、IEnumerable、IEnumera

MorphyYang的博客 1588
上一篇: 一键ghost(1key ghost)更改备份路径的方法
下一篇: where(C# 参考)
VS_URL
博客等级 码龄15年 12粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值