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

从FOC到你的无人机:深入浅出讲透Clark/Park变换在无刷电机控制中的核心作用

本文深入解析Clark变换与Park变换在无刷电机控制中的核心作用,揭示其如何将三相交流电转换为旋转坐标系下的直流量,实现无人机电机的高效精准控制。通过STM32硬件加速和工程实践案例,展示这对数学变换如何成为FOC算法的神经中枢,大幅提升系统响应速度和能效表现。

weixin_42628941的博客 168

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

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

dotNET跨平台 986

手把手教你构建轻量级CLIP模型:从理论到实践

本文手把手教你从零构建一个轻量级CLIP模型,深入解析其核心原理——对比学习,并提供完整的代码实践。通过精简的模型架构、数据准备和训练循环实现,帮助读者彻底理解多模态模型如何让图像与文本在共享空间中对齐,为学习更复杂的AI模型打下坚实基础。

weixin_29100927的博客 325

数值计算之 插值法(4)切比雪夫零点插值

数值计算之 插值法(4)切比雪夫零点插值前言插值点选取第一类切比雪夫多项式拉格朗日插值多项式的余项切比雪夫零点插值后记 前言 上篇插值法讨论了多项式插值的解,以及龙格现象。本篇将介绍一种在抽取节点时有效降低龙格现象的方法——切比雪夫零点插值。 插值点选取 插值多项式阶数较高时,在取值空间均匀取点,容易出现龙格现象。 即区间边缘的插值结果与原函数差异很大,而区间中央的插值结果相对较好。这表明,高阶多项式插值对区间中央的节点拟合好,而对两端节点拟合效果差。 自然而然会想到,在两端多采样一些节点,在中间少采样一

qq_41035283的博客 1万+

C# 传统遍历与迭代器

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

cjolj的专栏 8486

告别手动配置!用Vector vLinkGen 2.1.0自动生成AUTOSAR链接脚本(附bss段配置详解)

本文详细介绍了如何使用Vector vLinkGen 2.1.0工具自动生成AUTOSAR链接脚本,告别繁琐的手动配置。通过解析vLinkGen的核心架构和bss段配置实践,帮助开发者提升嵌入式软件开发效率,支持多种主流编译器,实现精确的内存分配和初始化策略。

weixin_28716181的博客 377

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

OCR开发实战:如何用PaddleOCR C++版实现本地文字识别(附模型文件处理技巧)

本文详细介绍了如何使用PaddleOCR C++版实现本地文字识别,包括环境搭建、工程编译、运行时优化等全流程。重点讲解了在VS2019/VS2022环境下配置PaddleOCR的CPU推理性能优化技巧,以及模型文件处理的实际应用方法,帮助开发者高效完成OCR本地化部署。

devops8pract的博客 334

避坑指南:在Linux服务器上用Conda安装antiSMASH 5.2.0(解决Jinja2报错和Matplotlib权限问题)

本文详细介绍了在Linux服务器上使用Conda安装antiSMASH 5.2.0的避坑指南,重点解决了Jinja2报错和Matplotlib权限问题。通过创建专用conda环境、安装指定版本依赖包和配置缓存目录,帮助用户顺利完成antiSMASH的本地部署,适用于批量处理基因组分析任务。

weixin_26911099的博客 315

迭代器

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

weixin_33950757的博客 143

SAP 权限配置(复合角色)

复合角色创建步骤:业务场景:通常单一角色权限颗粒度划分比较细,当需要分配单一角色权限A、B(多个单一角色)给某账号用户Y时,可以先建立一个复合角色C,将A、B绑定到复合角色C中,再将角色C分配给账号Y即完成权限配置。 业务模拟: 1、PFCG创建复合角色: 2、在角色页面添加子角色 在角色分页内添加子角色,点击“菜单”分页中的“读菜单”即可导入子角色中的菜单: 3、将用户分配给...

willieyuan的博客 7087

C#2.0新特性—迭代器

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

junmail的专栏 770

初学者入门YOLO目标检测:从懵圈到上手,这篇文章讲透所有核心(附学习路径+避坑指南)

目标:比如训练一个“检测苹果和橘子”的模型,或者“检测人脸”的模型;任务:学会用LabelImg标注数据,制作YOLO格式的数据集,用命令行训练模型;关键:不用追求高精度,能训练出一个能检测出目标的模型就行。很多初学者卡在入门阶段,不是因为智商不够,而是因为“想太多,做太少”——总觉得要把所有原理搞懂才能动手,结果越想越怕,最后放弃。先动手,再动脑。先跑通一个案例,获得成就感;再制作自定义数据集,训练简单模型;最后再回头去理解原理,优化模型。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 688

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C#2.0简介

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

fzzf 734

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

powersea2的专栏 297

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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、付费专栏及课程。

余额充值