全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C# yield关键字的作用 - 实现迭代器与状态机的简便方法

yield关键字用于声明迭代器方法,使方法能逐个提供序列元素并自动管理状态;返回类型须为IEnumerable等,编译器自动生成状态机,支持延迟计算与内存优化。

yield 关键字在 C# 中不是用来“返回值”或“跳出方法”的,而是专门用于声明迭代器方法(iterator method)——它让方法能逐个提供序列元素,同时自动帮你管理状态,不用手动写复杂的迭代器类。

让方法变成可迭代的序列生成器

普通方法只能一次性返回一个结果,而用 yield return 的方法,每次调用 MoveNext()(比如在 foreach 中)时,会从上次暂停的位置继续执行,直到遇到下一个 yield return 或方法结束。这样你就能用很简洁的代码写出“边算边给”的逻辑。

  • 方法返回类型必须是 IEnumerableIEnumerator 或其非泛型对应类型
  • 方法体内不能有 return value;(但可以有 return; 表示结束迭代)
  • 不能在匿名方法、lambda 表达式或 async 方法中使用 yield(C# 7.0+ 支持 async 迭代器,但需用 IAsyncEnumerableyield return 配合 await

编译器自动生成状态机,你不用操心细节

你写的含 yield 的方法,编译器会在后台生成一个私有嵌套类(状态机),实现 IEnumerator 接口,并维护当前执行位置、局部变量等状态。你完全不用手动实现 CurrentMoveNext()Dispose() 等成员。

  • 所有局部变量会被“提升”为状态机类的字段,保证跨多次 MoveNext() 调用时值不丢失
  • 每个 yield return 对应一个状态编号,编译器用 switch 控制流程跳转
  • 调试时能看到自动生成的 d__N 类,但日常开发无需关注

常见实用场景:延迟计算 + 节省内存

适合处理大数据流、无限序列、IO 边读边处理等场景,避免一次性加载全部数据到内存。

  • 遍历文件行:foreach (var line in ReadLines("log.txt")) { ... },每行只读一次、不缓存全文
  • 生成斐波那契数列:yield return a; int temp = a; a = b; b = temp + b;,按需计算下一项
  • 过滤并转换集合:foreach (var x in source) if (x > 0) yield return x * 2;,链式处理无中间数组

注意:yield break 提前终止迭代

yield break 不是退出方法,而是告诉迭代器“这里没更多元素了”,后续调用 MoveNext() 将返回 false。常用于条件提前结束,比如空集合检查或达到阈值。

  • if (items == null) yield break;
  • for (int i = 0; i

基本上就这些。用好 yield,写迭代逻辑更轻量、更直观,也更符合 .NET 的惯用风格。


# 大数据  # ai  # switch  # c#  # .net  # NULL  # if  # for  # foreach  # break  # 局部变量  # 斐波那契数列  # int  # Lambda  # 接口  # Length  # 泛型  # 匿名方法  # var  # 迭代  # 自动生成  # 链式  # 你就  # 遍历  # 帮你  # 会在  # 能在  # 能有  # 跳转 


相关文章: 深入理解Android中的xmlns:tools属性  如何快速重置建站主机并恢复默认配置?  详解jQuery中基本的动画方法  常州企业建站如何选择最佳模板?  建站上市公司网站建设方案与SEO优化服务定制指南  如何快速上传建站程序避免常见错误?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  如何快速搭建FTP站点实现文件共享?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  浅谈Javascript中的Label语句  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何在阿里云香港服务器快速搭建网站?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  名字制作网站免费,所有小说网站的名字?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  已有域名能否直接搭建网站?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  深圳网站制作的公司有哪些,dido官方网站?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何在万网主机上快速搭建网站?  如何高效完成自助建站业务培训?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  如何配置WinSCP新建站点的密钥验证步骤?  Android自定义listview布局实现上拉加载下拉刷新功能  如何快速配置高效服务器建站软件?  h5在线制作网站电脑版下载,h5网页制作软件?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  建站之星在线客服如何快速接入解答?  安徽网站建设与外贸建站服务专业定制方案  成都网站制作报价公司,成都工业用气开户费用?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何做网站制作流程,*游戏网站怎么搭建?  建站之星各版本价格是多少?  如何快速搭建虚拟主机网站?新手必看指南  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  如何快速搭建个人网站并优化SEO?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何高效完成独享虚拟主机建站?  教学网站制作软件,学习*后期制作的网站有哪些?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  如何挑选高效建站主机与优质域名?  如何高效配置IIS服务器搭建网站?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何确保西部建站助手FTP传输的安全性?  江苏网站制作公司有哪些,江苏书法考级官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。