深入理解C#中的yield关键字:提升迭代性能与效率

文章目录

  • 前言
  • [一、yield return](#一、yield return)
  • [二、yield break](#二、yield break)
  • 总结

前言

在C#中,yield 关键字是特别用于迭代器块和方法中的,它允许你逐个返回序列中的元素,而不是一次性返回整个集合。使用 yield 可以显著提高处理大数据集或进行复杂迭代时的性能和内存效率,因为它允许按需生成和返回数据,而不是预先生成整个数据集。


一、yield return

yield return 语句用于在迭代器块中返回一个元素,并且每次迭代时只执行到下一个 yield return 语句或迭代器块的末尾。当迭代器块执行完毕时,迭代结束。

csharp 复制代码
public static IEnumerable<int> GetNumbers()  
{  
    for (int i = 0; i < 10; i++)  
    {  
        yield return i;  
    }  
}  
  
// 使用  
foreach (var number in GetNumbers())  
{  
    Console.WriteLine(number);  
}

GetNumbers 方法使用 yield return 逐个返回从0到9的数字。每次迭代调用 GetNumbers() 方法时,它都会从上次停止的地方继续执行,直到所有数字都被返回。

二、yield break

yield break 语句用于提前退出迭代器块。如果在迭代器块中遇到 yield break 语句,迭代器将停止执行,并且不会返回任何更多的元素。

csharp 复制代码
public static IEnumerable<int> GetNumbersUpTo(int limit)  
{  
    for (int i = 0; i < limit; i++)  
    {  
        if (i == 5) // 假设我们只想要前5个数字  
        {  
            yield break;  
        }  
        yield return i;  
    }  
}  
  
// 使用  
foreach (var number in GetNumbersUpTo(10))  
{  
    Console.WriteLine(number);  
}

GetNumbersUpTo 方法在返回第5个数字后立即使用 yield break 退出迭代器块,因此不会返回任何超过5的数字。


总结

注意事项:

  • 含有 yield return 语句的方法必须返回 IEnumerable、IEnumerable、IEnumerator 或 IEnumerator。
  • 迭代器块不能包含 return 语句,除非该语句后面紧跟一个 yield break(在这种情况下,它实际上并不返回任何值)。
  • 使用 yield 可以使代码更加简洁,并且可以提高处理大数据集时的性能。然而,它也有一些限制,比如不能用于非迭代器的上下文中,且不能用于异步方法中(C# 5.0及之前版本)。不过,从C# 8.0开始,引入了异步迭代器(async iterators),允许你在异步方法中使用 yield return 和 await。

不能使用 yield 的情况:

  • yield return 不能套在 try-catch 中。
  • yield break 不能放在 finally 中。
  • yield 不能用在带有 in、ref 或 out 参数的方法。
  • yield 不能用在 Lambda 表达式和匿名方法。
  • yield 不能用在包含不安全的块(unsafe)的方法。

"笑对人生,智慧同行!博客新文出炉,微信订阅号更新更实时,等你笑纳~"

相关推荐
_日拱一卒11 分钟前
LeetCode:114二叉树展开为链表
java·开发语言·算法
天天进步201514 分钟前
从零打造 Python 全栈项目:智能教学辅助系统
开发语言·人工智能·python
kkeeper~30 分钟前
0基础C语言积跬步之内存函数
c语言·开发语言
吃好睡好便好31 分钟前
在Matlab中绘制杆状图
开发语言·学习·算法·matlab·信息可视化
桀人35 分钟前
C++——内存管理——new和delete的超详细解析
开发语言·c++
Shadow(⊙o⊙)36 分钟前
Shell进程替换,自定义Shell解释器——字符串库函数灵活操作!
linux·运维·服务器·开发语言·c++·学习
数智工坊1 小时前
PyCharm 运行 Python 脚本总自动进 Test 模式?附 RT-DETRv2 依赖缺失终极排坑
开发语言·ide·人工智能·python·pycharm
再写一行代码就下班1 小时前
根据给定word模板,动态填充指定内容,并输出为新的word文档。(${aa}占位符方式且支持循环动态表格)
java·开发语言
七夜zippoe1 小时前
DolphinDB流数据表:创建与订阅
开发语言·订阅··dolphindb·数据表
魔法阵维护师1 小时前
从零开发游戏需要学习的c#模块,第十八章(2D 碰撞检测与金币收集)
学习·游戏·c#