C# yield
C#中的yield可以应用在一个可迭代的方法中,我们必须真正理解此关键词,才能将它正确的应用到实际生产中。为了说明yield会出现让我们迷惑的结果,下面先定义一个MyObject类:
1 class MyObject 2 { 3 public int Value{get;set;} 4 }
MyObject类用于存放一个值,下面定义一个IEnumerable<MyObject>的方法:
1 IEnumerable<MyObject> GetYieldObjects() 2 { 3 for (int i = 0; i < 10; i++) 4 { 5 Console.WriteLine("GetObjects() i="+i.ToString()); 6 yield return new MyObject() { Value = i }; 7 } 8 }
方法中用yield return返回实例化的MyObject对象,为了便于记录GetYieldObjects()方法实际调用的过程,这里用Console.WriteLine来记录每次调用的过程。下面声明一个objects对象,然后进行第一次迭代,在第一次迭代过程中,对每个迭代项目的值进行+10处理,然后进行第2此迭代,看看是否会将处理后的值进行输出:
1 //此时不调用GetObjects()的内部循环 2 var objects = GetYieldObjects(); 3 //每次迭代会调用GetObjects()对应i的内容 4 foreach (var item in objects) 5 { 6 Console.WriteLine("1 foreach (var item in objects) item.Value=" + item.Value.ToString());//0..9 7 item.Value += 10; 8 } 9 //每次迭代会调用GetObjects()对应i的内容 10 foreach (var item in objects) 11 { 12 Console.WriteLine("2 foreach (var item in objects) item.Value=" + item.Value.ToString());//0..9 13 Console.WriteLine(item.Value.ToString());//0..9 14 }
在第2次迭代时,输出的还是0到9,并不是10到19.请看下面的迭代过程:
当第一次迭代时候,每次迭代会调用GetObject()方法中的yield return语句,而不是在var objects=GetObjects()进行实例化。当yield取到一个MyObject对象后立刻返回给迭代器,并将其值进行输出,然后继续调用GetObjects方法中的yield return语句,
因此每次循环时,实际上都是一个新的对象。如下图所示:
当然如果将上面的代码稍作修改,用objects=GetYieldObjects().ToArray()的话,那么第二次输出的就是10到19:
1 objects = GetYieldObjects().ToArray(); 2 foreach (var item in objects) 3 { 4 item.Value += 10; 5 } 6 7 foreach (var item in objects) 8 { 9 Console.WriteLine(item.Value.ToString());//10..19 10 }
出处:http://www.cnblogs.com/isaboy/
声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?