C#中的“收益率突破”是什么?
我在MSDN中看到过这种语法: break
,但我不知道它是做什么的。 有人知道吗?
#1楼
yield
基本上使IEnumerable<T>
方法的行为类似于协作(而不是抢占式)调度线程。
yield return
就像一个调用“schedule”或“sleep”函数的线程来放弃对CPU的控制。 就像一个线程一样, IEnumerable<T>
方法会立即重新获得控件,所有局部变量都具有与放弃控制之前相同的值。
yield break
就像一个线程到达其功能的终点并终止。
人们谈论的是“状态机”,但状态机实际上都是“线程”。 线程具有一些状态(即局部变量的值),并且每次调度它都需要一些操作才能达到新状态。 关于yield
的关键点在于,与我们习惯使用的操作系统线程不同,使用它的代码会被及时冻结,直到迭代被手动提前或终止。
#2楼
结束迭代器块(例如,IEnumerable中没有更多元素)。
#3楼
如果你的意思是“什么让收益突破呢?”,“它是如何运作的” - 请参阅Raymond Chen的博客了解详情http://blogs.msdn.com/oldnewthing/archive/2008/08/12/8849519。 ASPX
C#迭代器生成一些非常复杂的代码。
#4楼
告诉迭代器它已到达终点。
举个例子:
public interface INode
{IEnumerable<Node> GetChildren();
}public class NodeWithTenChildren : INode
{private Node[] m_children = new Node[10];public IEnumerable<Node> GetChildren(){for( int n = 0; n < 10; ++n ){yield return m_children[ n ];}}
}public class NodeWithNoChildren : INode
{public IEnumerable<Node> GetChildren(){yield break;}
}
#5楼
它指定迭代器已经结束。 您可以将yield break
视为不返回值的return
语句。
例如,如果将函数定义为迭代器,则函数体可能如下所示:
for (int i = 0; i < 5; i++)
{yield return i;
}Console.Out.WriteLine("You will see me");
请注意,在循环完成所有循环后,最后一行将被执行,您将在控制台应用程序中看到该消息。
或者像这样的yield break
:
int i = 0;
while (true)
{if (i < 5){yield return i;}else{// note that i++ will not be executed after thisyield break;}i++;
}Console.Out.WriteLine("Won't see me");
在这种情况下,永远不会执行最后一个语句,因为我们提前离开了函数。
#6楼
在Jon Skeet的C#深度书中,这个免费的样本章节详细介绍了迭代器块的整个主题。
#7楼
http://www.alteridem.net/2007/08/22/the-yield-statement-in-c/就是一个非常好的例子:
public static IEnumerable<int> Range( int min, int max ) {while ( true ){if ( min >= max ){yield break;}yield return min++;} }
并解释说,如果在方法中命中了yield break
语句,则该方法的执行将停止而不返回。 有一些时间情况,当你不想给出任何结果时,你可以使用yield break。
#8楼
yield break
语句导致枚举停止。 实际上, yield break
完成枚举而不返回任何其他项。
考虑到迭代器方法实际上有两种方法可以停止迭代。 在一种情况下,该方法的逻辑可以在返回所有项之后自然地退出该方法。 这是一个例子:
IEnumerable<uint> FindPrimes(uint startAt, uint maxCount)
{for (var i = 0UL; i < maxCount; i++){startAt = NextPrime(startAt);yield return startAt;}Debug.WriteLine("All the primes were found.");
}
在上面的示例中,一旦找到maxCount
primes,迭代器方法将自然停止执行。
yield break
语句是迭代器停止枚举的另一种方式。 这是一种早期打破枚举的方法。 这是与上述相同的方法。 这次,该方法对方法可以执行的时间量有限制。
IEnumerable<uint> FindPrimes(uint startAt, uint maxCount, int maxMinutes)
{var sw = System.Diagnostics.Stopwatch.StartNew();for (var i = 0UL; i < maxCount; i++){startAt = NextPrime(startAt);yield return startAt;if (sw.Elapsed.TotalMinutes > maxMinutes)yield break;}Debug.WriteLine("All the primes were found.");
}
注意对yield break
的调用。 实际上,它很早就退出了枚举。
另请注意, yield break
工作方式不同于普通的break
。 在上面的示例中, yield break
退出方法而不调用Debug.WriteLine(..)
。
#9楼
yield break只是最后一次回复的一种方式,并且不会返回任何值
例如
// returns 1,2,3,4,5
IEnumerable<int> CountToFive()
{yield return 1;yield return 2;yield return 3;yield return 4;yield return 5;yield break;yield return 6;yield return 7;yield return 8;yield return 9;}
#10楼
yield关键字与return关键字一起使用,为枚举器对象提供值。 yield return指定返回的值或值。 达到yield return语句时,将存储当前位置。 下次调用迭代器时,将从此位置重新启动执行。
使用示例解释含义:
public IEnumerable<int> SampleNumbers() { int counter = 0; yield return counter; counter = counter + 2; yield return counter; counter = counter + 3; yield return counter ; }
迭代时返回的值为:0,2,5。
值得注意的是,此示例中的计数器变量是局部变量。 在返回值2的第二次迭代之后,第三次迭代从它之前离开的位置开始,同时保留名为counter的本地变量的前一个值,即2。
C#中的“收益率突破”是什么?相关推荐
- 微软研究员在ImageNet计算机视觉识别挑战中实现里程碑式突破
微软研究员在ImageNet计算机视觉识别挑战中实现里程碑式突破 微软亚洲研究院 2015年2月11日 本文翻译自:Microsoft Researchers' Algorithm Sets Im ...
- 同时替换栈中和.data中的Cookie突破GS
文章是我之前发在吾爱破解论坛的,直接搬过来了.有问题大家可以直接提问. 最近刚刚接触漏洞调试逆向,希望能够将自己调试过程中的看法与大家分享,望大神们不要喷我.参考书籍就是有名的<0day> ...
- 柳传志:联想发展过程中的三大突破
7月3日消息,联想系的创始人.联想控股总裁柳传志今日总结了联想发展过程中的三大创新,分别是观念创新.体制创新.管理创新. 3日上午,纪念中关村科技园区海淀园创新发展20周年座谈会在北京世纪金源大饭店举 ...
- 【转载于庄卓然长微博】 阿里2013年双十一准备中的技术突破与亮点
声明: [转载]c.blog.sina.com.cn/profile.php?blogid=e59371cc890001rm 今年是双十一购物狂欢节的第五个年头,每一年这个时刻对于技术团队而言都是一次 ...
- 阿里2013年双十一准备中的技术突破与亮点
@阿里技术保障部/11月07日 转载自:http://c.blog.sina.com.cn/profile.php?blogid=e59371cc890001rm&sudaref=geek.c ...
- 中石油市值突破1万亿美元高居全球第一
中国石油(601857.SH) ,昨日收盘时总市值已经突破了1万亿美元.尽管目前中石油还没有计入指数,但是对于市场的影响力却在上市首日就已经获得充分表现. 目前,中石油A股总股本为1619.22亿股, ...
- 2013阿里巴巴双十一准备中的技术突破与亮点
今年是双十一购物狂欢节的第五个年头,每一年这个时刻对于技术团队而言都是一次 真刀实枪的数字战争.一方面,我们会提前在产品和业务层面努力创新,力争在当天为消费者留下更优质的购物体验.另一方面,全国人民的 ...
- 出生率大跌,母婴企业在“内卷”大战中该如何突破?
随着我国出生率的持续降低,母婴行业的受众群体开始缩小,但源源不断的企业入局母婴行业,需求变小,供给增加,难免形成竞争加剧的现状. 加之社会发展进步,人们更加注重物质和精神层面的享受,因此对于母婴产品或 ...
- 中科大量子计算机重大突破,中国科大在量子计算研究中获重大突破
近日,中国科学技术大学微尺度物质科学国家实验室杜江峰教授领导的研究小组和香港中文大学刘仁保教授合作,通过电子自旋共振实验技术,在国际上首次通过固态体系实验实现了最优动力学解耦,极大地提高了电子自旋相干 ...
最新文章
- 《2020雇佣关系趋势报告》今发布:近三成受访者兼职,近七成工作量增加、考核变严格
- 二维数组 类型_「初识C语言」二维数组
- windows驱动程序编写_如何在Windows中回滚驱动程序
- [Windows]_[0基础]_[Release程序的崩溃报告minidump解决方式]
- workbook加载文件路径_通过Workbook.XML 修复Excel自定义名称
- JavaScript知识笔记(一)——入门、语句、注释、变量、函数、输出内容、对话框、窗口
- LintCode 1210. 升序子序列(DFS)
- Centos 7安装报错:Warning:dracut-initqueue timeout - starting timeout scripts
- 剑指 Offer II 042. 最近请求次数【队列方法】
- kafka 重新分配partition
- 噪声报警c语言程序,环境噪声监测器(软件部分).doc
- 国产PC-PPI编程电缆解剖+Profibus DP网络连接简述 两篇
- Aliplayer视频点播加密播放
- 如何将pdf文件转换成图片?
- Freemarker函数
- 树莓派4B系统烧录——Raspberry Pi Imager
- 论文阅读《Characterizing BDS signal-in-space performance from integrity perspective》3
- MySQL数据库:创建一个表,并执行插入、修改和删除数据操作
- GridView横向显示 实现图片预览
- 信息与通信工程保研经验之上科大北理成电浙大东南西交