zoukankan      html  css  js  c++  java
  • Linq学习总结(3)——yield

    yield向编译器指示它所在的方法是迭代器块。

    yield并不是.NET中的关键字,所以我们可以将它用于变量名。不过yield return和yield break就是关键词组了。

    yield return

    yield return 是迭代器(Iterator Pattern)模式的一种实现,能够将本身不是可迭代集合的对象做成可迭代集合。

    static void Main(string[] args)
    {
    foreach (var item in getNums())
    {
    Console.WriteLine(item);
    }
    }

    static IEnumerable getNums()
    {
    yield return "start";

    yield return 1;
    yield return 2;
    yield return 3;
    yield return 4;

    yield return "end";
    }

    注意事项:

    • yield return后面要跟一个表达式,该表达式必须能转换为迭代器所使用的类型;
    • yield return只能用于迭代器块中;这个迭代器块即可以放在方法体中,也可以放在运算函数中,还可以用在访问器中(即属性方法);
    • yield return 不能在不安全块中(unsafe);
    • 方法、运算符或访问器的参数不能是ref或out;
    • yield return不能出现在catch语句中,也不能出现在带有一个或多个catch子句的try块中;
    • yield 语句不能出现在匿名方法中。

    yield break

    由于某种原因,需要在最后的元素返回之前就结束掉可以用yield break关键词组。

    static void Main(string[] args)
    {
    foreach (var item in getNums())
    {
    Console.WriteLine(item);
    }
    }

    static IEnumerable getNums()
    {
    yield return "start";

    yield return 1;
    yield return 2;

    yield break;

    yield return 3;
    yield return 4;

    yield return "end";
    }

    这样就不会输出2之下的信息了。

    总结

    关键词组yield return和yield break是在.NET 2.0中引入的。Yield return用于创建一个自动生成的、类型化的枚举器,而yield break则用于达到最终元素之前终止迭代。它们在LINQ查询上也非常有用,LINQ的延迟机制的关键就是在yield上。

    更多相关文章可以查看:(MARK)

    http://kb.cnblogs.com/page/42581/

    http://www.cnblogs.com/jeffreyzhao/archive/2010/01/26/decompile-methods-with-yield-manually.html

  • 相关阅读:
    GIT和SVN之间的五个基本区别
    nolock的使用
    Net线程足迹 传递参数至线程
    .NET中的三种Timer的区别和用法(转)
    探索并发编程(六)------Java多线程性能优化
    探索并发编程(七)------分布式环境中并发问题
    Lock与synchronized 的区别
    常用EXE文件反编译工具
    Socket原理
    开源的力量(随时更新)
  • 原文地址:https://www.cnblogs.com/heqichang/p/2085983.html
Copyright © 2011-2022 走看看