yield关键字用于简化迭代器实现,支持惰性求值和内存优化;通过yield return逐个返回元素,yield break提前终止迭代,适用于大数据流、递归结构等场景;使用时需注意不能包含ref/out参数、不可在lambda中使用,且异常可能在遍历时才抛出。

在C#中,yield 关键字用于简化迭代器的实现,让你可以轻松创建一个能够被 foreach 遍历的对象,而无需手动实现 IEnumerable 或 IEnumerator 接口。它主要用在方法、属性或索引器中,返回可枚举的集合。
yield return 的基本用法
当你在一个返回类型为 IEnumerable 或 IEnumerator 的方法中使用 yield return,每次执行到 yield return 时,会返回一个元素,并记住当前执行位置,下次继续从下一条语句开始执行。
示例:生成一个简单的数字序列
“`csharpusing System;using System.Collections.Generic;
public static IEnumerable GetNumbers(){yield return 1;yield return 2;yield return 3;yield return 4;yield return 5;}
// 使用foreach (int num in GetNumbers()){Console.WriteLine(num);}
输出:12345
这个方法看起来像是一次性返回多个值,实际上它是“惰性求值”——只有在遍历时才会逐个产生值,节省内存和提升性能。
yield break 中断迭代
yield break 用于提前终止迭代,类似于普通方法中的 break。
示例:根据条件中断遍历
```csharppublic static IEnumerable GetNumbersUntil(int max){ int i = 1; while (true) { if (i > max) yield break; // 停止迭代 yield return i++; }}
调用 GetNumbersUntil(3) 会返回 1, 2, 3,然后停止。
实际应用场景
yield 特别适合处理大数据流、递归结构或需要延迟加载的场景。
示例:遍历二叉树(中序)
```csharppublic class TreeNode{ public int Value; public TreeNode Left; public TreeNode Right;
public IEnumerable InOrder(){ if (Left != null) foreach (int val in Left.InOrder()) yield return val; yield return Value; if (Right != null) foreach (int val in Right.InOrder()) yield return val;}
}
这种方式代码简洁,且不会一次性把所有节点放入列表,节省内存。
注意事项
- 使用 yield 的方法不能包含 ref 或 out 参数。
- 不能在匿名方法或 lambda 表达式中使用 yield。
- 异常处理中要小心:yield 方法中的异常可能在遍历时才抛出。
- 返回的是状态机对象,多次遍历不会重复执行逻辑,除非重新调用方法。
基本上就这些。yield 让你写出更清晰、高效的迭代逻辑,特别适合自定义集合遍历。掌握它,能让代码更 C# 化。
以上就是C#中的yield关键字怎么用 C#使用yield return实现迭代器的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1441404.html
微信扫一扫
支付宝扫一扫