C#中的yield关键字怎么用 C#使用yield return实现迭代器

来源:这里教程网 时间:2026-02-21 17:29:54 作者:

在C#中,yield 关键字用于简化迭代器的实现,让你可以轻松创建一个能够被 foreach 遍历的对象,而无需手动实现 IEnumerableIEnumerator 接口。它主要用在方法、属性或索引器中,返回可枚举的集合。

yield return 的基本用法

当你在一个返回类型为 IEnumerableIEnumerator 的方法中使用 yield return,每次执行到 yield return 时,会返回一个元素,并记住当前执行位置,下次继续从下一条语句开始执行。

示例:生成一个简单的数字序列

```csharp using 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); }

输出:
<pre class="brush:php;toolbar:false;">
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 IEnumerable<int> 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;
}

}

</p>
<p>这种方式代码简洁,且不会一次性把所有节点放入列表,节省内存。</p>
<H3>注意事项</H3>
<p>
<ul>
  <li>使用 <strong>yield</strong> 的方法不能包含 <strong>ref</strong> 或 <strong>out</strong> 参数。</li>
  <li>不能在匿名方法或 lambda 表达式中使用 <strong>yield</strong>。</li>
  <li>异常处理中要小心:yield 方法中的异常可能在遍历时才抛出。</li>
  <li>返回的是状态机对象,多次遍历不会重复执行逻辑,除非重新调用方法。</li>
</ul>
</p>
<p>基本上就这些。yield 让你写出更清晰、高效的迭代逻辑,特别适合自定义集合遍历。掌握它,能让代码更 C# 化。

相关推荐