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

在C#中,yield 关键字用于简化迭代器的实现,让你可以轻松创建一个能够被 foreach 遍历的对象,而无需手动实现 IEnumerable 或 IEnumerator 接口。它主要用在方法、属性或索引器中,返回可枚举的集合。
yield return 的基本用法
当你在一个返回类型为 IEnumerable 或 IEnumerator 的方法中使用 yield return,每次执行到 yield return 时,会返回一个元素,并记住当前执行位置,下次继续从下一条语句开始执行。
示例:生成一个简单的数字序列
```csharp using System; using System.Collections.Generic;
public static IEnumerable
// 使用 foreach (int num in GetNumbers()) { Console.WriteLine(num); }
输出:1 2 3 4 5这个方法看起来像是一次性返回多个值,实际上它是“惰性求值”——只有在遍历时才会逐个产生值,节省内存和提升性能。
yield break 中断迭代
yield break 用于提前终止迭代,类似于普通方法中的 break。
示例:根据条件中断遍历```csharp public static IEnumerable
GetNumbersUntil(int max) { int i = 1; while (true) { if (i > max) yield break; // 停止迭代 yield return i++; } } 调用
GetNumbersUntil(3)会返回 1, 2, 3,然后停止。实际应用场景
yield 特别适合处理大数据流、递归结构或需要延迟加载的场景。
示例:遍历二叉树(中序)
```csharp public class TreeNode { public int Value; public TreeNode Left; public TreeNode Right;
public IEnumerableInOrder() { 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# 化。










