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

在C#中,yield 关键字用于简化迭代器的实现,让你可以轻松创建一个能够被 foreach 遍历的对象,而无需手动实现 IEnumerable 或 IEnumerator 接口。它主要用在方法、属性或索引器中,返回可枚举的集合。
当你在一个返回类型为 IEnumerable 或 IEnumerator 的方法中使用 yield return,每次执行到 yield return 时,会返回一个元素,并记住当前执行位置,下次继续从下一条语句开始执行。
示例:生成一个简单的数字序列
```csharp using System; using System.Collections.Generic;
public static IEnumerable
// 使用 foreach (int num in GetNumbers()) { Console.WriteLine(num); }
输出:
<pre>
1
2
3
4
5
</pre>
</p>
<p>这个方法看起来像是一次性返回多个值,实际上它是“惰性求值”——只有在遍历时才会逐个产生值,节省内存和提升性能。</p>
<H3>yield break 中断迭代</H3>
<p><strong>yield break</strong> 用于提前终止迭代,类似于普通方法中的 <strong>break</strong>。</p>
<font color="#0000FF">示例:根据条件中断遍历</font>
<p>
```csharp
public static IEnumerable<int> 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# 化。
以上就是C#中的yield关键字怎么用 C#使用yield return实现迭代器的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号