在C#编程中,迭代器(Iterator)是一种非常强大的语言特性,它允许我们以一种简洁、高效的方式遍历集合。而 yield return 是实现自定义迭代器的核心语法。本教程将从零开始,带你彻底理解 C#迭代器 和 yield return 的工作原理,并通过实例让你轻松上手。

迭代器是一种设计模式,用于顺序访问一个聚合对象中的各个元素,而不暴露其内部表示。在C#中,任何实现了 IEnumerable 或 IEnumerable<T> 接口的类型都可以被 foreach 循环遍历。
传统方式需要手动编写一个类来实现这些接口,但使用 yield return,C#编译器会自动为我们生成所需的迭代器类!
下面是一个最简单的例子,展示如何使用 yield return 创建一个返回数字序列的方法:
public static IEnumerable<int> GetNumbers(){ yield return 1; yield return 2; yield return 3;}调用这个方法时,你可以像遍历数组一样使用 foreach:
foreach (int num in GetNumbers()){ Console.WriteLine(num);}// 输出:// 1// 2// 3很多人对 yield return 感到困惑,因为它看起来像是“多次返回”——这在普通方法中是不可能的。其实,C# 编译器会在背后为你生成一个状态机(State Machine),每次调用 MoveNext() 时,都会从上次 yield return 的位置继续执行。
这意味着:**延迟执行(Lazy Evaluation)**。只有当你真正需要下一个值时,代码才会运行到下一个 yield return。
让我们用 C# yield关键字 实现一个无限斐波那契数列生成器(当然,我们会加个限制避免无限循环):
public static IEnumerable<long> Fibonacci(int count){ if (count < 0) throw new ArgumentException("count 不能为负数"); long a = 0, b = 1; for (int i = 0; i < count; i++) { yield return a; long temp = a + b; a = b; b = temp; }}使用方式:
foreach (long num in Fibonacci(10)){ Console.Write(num + " ");}// 输出:0 1 1 2 3 5 8 13 21 34注意:即使你只取前5个数(比如用 .Take(5)),后面的计算也不会执行——这就是 延迟执行 的优势!
除了 yield return,还有一个配套关键字:yield break,用于提前结束迭代。
public static IEnumerable<int> GetPositiveNumbers(IEnumerable<int> numbers){ foreach (int n in numbers) { if (n <= 0) yield break; // 遇到非正数就停止 yield return n; }}yield 方法中使用 try-catch-finally(C# 7.0 之前不支持,之后有限支持)。yield 方法中修改外部变量状态,容易引发难以调试的问题。通过本教程,你应该已经掌握了 C#迭代器 的核心概念和 yield return 的使用方法。它不仅让代码更简洁,还能提升性能(尤其是处理大数据时)。记住,yield return 背后是编译器生成的状态机,它实现了延迟执行和按需计算。
现在,你可以尝试自己编写一些有趣的迭代器,比如读取日志文件的每一行、生成素数序列、或者遍历树结构——发挥你的想象力吧!
关键词回顾:C#迭代器、yield return、C# yield关键字、C#自定义迭代。
本文由主机测评网于2025-12-09发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025125080.html