yield 语法备忘录

 
 

yield 语法备忘录

语法 .net


yield 读作:“一有得” 英式发音 皮一下~
yield 关键字向编译器指示它所在的方法是迭代器块。 编译器生成一个类来实现迭代器块中表示的行为。

  • 它可以搭配两个关键字来使用一个是return 另一是 break

  • 在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值。 这是一个返回值,例如,在 foreach 语句的每一次循环中返回的值。

      private static IEnumerable<int> yieldTest()
    {
    var testnum = new List<int>(){1,2,3,4,5,6,7,8,9,0}; foreach (int test in testnum)
    {
    yield return test;
    } }
  • 而我们一般如果不用yield返回的代码则需要new一个对象然后add再返回IEnumerable像这样

      private static IEnumerable<int> yieldTest()
    {
    var testnum = new List<int>(){1,2,3,4,5,6,7,8,9,0}; List rtnum = new List<int>(); foreach (int test in testnum)
    {
    rtnum.Add(test);
    }
    return rtnum;
    }
  • 在 yield break 语句中,控制权将无条件地返回给迭代器的调用方,也就是直接退出返回结果。

       private static IEnumerable<int> yieldTest()
    {
    var testnum = new List<int>(){1,2,3,4,5,6,7,8,9,0}; for (int i = 0; i < testnum.Count; i++)
    {
    if(i == 5) {yield break;} yield return testnum[i];
    } Console.WriteLine("你用了yield break 则这条输出你是看不到的"); }
  • 如果你用的break则只是跳出当前循环,会继续执行完整个函数。

       private static IEnumerable<int> yieldTest()
    {
    var testnum = new List<int>(){1,2,3,4,5,6,7,8,9,0}; for (int i = 0; i < testnum.Count; i++)
    {
    if(i == 5) { break;} yield return testnum[i];
    } Console.WriteLine("你用了break 则这条输出你是可以看到的"); }
  • 注意不要将break与continue搞混 break是跳出整循环 continue则是跳过当前循环。

     private static IEnumerable<int> yieldTest()
    {
    var testnum = new List<int>(){1,2,3,4,5,6,7,8,9,0}; for (int i = 0; i < testnum.Count; i++)
    {
    if(i == 5) { continue;} yield return testnum[i];
    } }
  • 备注yield 语句只能出现在 iterator 块中,这种块可作为方法、运算符或访问器的主体实现。 这类方法、运算符或访问器的体受以下约束的控制:

    • 不允许不安全块。
    • 方法、运算符或访问器的参数不能是 ref 或 out。
    • yield return 语句不能放在 try-catch 块中的任何位置。 该语句可放在后跟 finally 块的 try 块中。
    • yield break 语句可放在 try 块或 catch 块中,但不能放在 finally 块中。
    • yield 语句不能出现在匿名方法中。
    • 当和 expression 一起使用时,yield return 语句不能出现在 catch 块中或含有一个或多个 catch 子句的 try 块中

最新文章

  1. Nuke
  2. Delphi Memory-Mapped File简单示例
  3. OC基础(5)
  4. C#开发基于Http的LaTeX数学公式转换器
  5. HDOJ 1846 Brave Game
  6. Android dialog 不消失
  7. 【IOS开发】SimPholders的使用
  8. Java TreeSet集合排序 &amp;&amp; 定义一个类实现Comparator接口,覆盖compare方法 &amp;&amp; 按照字符串长度排序
  9. python-闭包函数
  10. Windows添加.NET Framework 3.0 NetFx3 失败 - 状态为:0x800f0950
  11. 对Dom的认识
  12. maven 构建 war文件&amp;&amp;Glassfish运行+部署war文件+访问(命令行模式)
  13. git学习笔记:一台电脑上配置两个git账户
  14. 没有什么,开发ASP.NET时随便写写,想到什么写什么
  15. 【转】MySQL存储过程中使用动态行转列
  16. js 变量声明易混淆的几点知识
  17. 【bzoj3678】wangxz与OJ
  18. Linux 安装 EPEL YUM源
  19. 针对通过 SSH 连接到 Azure Linux VM 时发生的失败、错误或被拒绝问题进行故障排除
  20. java 常用模块代码

热门文章

  1. C#获取代码执行时间(精确到毫秒)
  2. caffe之android移植
  3. python——pymysql的安装
  4. 吴裕雄--天生自然 python数据分析:葡萄酒分析
  5. 深度视觉盛宴——CVPR 2016
  6. VMware虚拟机各版本密钥
  7. Pycharm2019.2激活至2089年
  8. 想要成为一名优秀的Java程序员,你需要这8个锦囊
  9. [面试专题]Web缓存详解
  10. 【30分钟学完】canvas动画|游戏基础(5):重力加速度与模拟摩擦力