C# yield return 和 yield break

原创 2016年08月29日 16:35:20

    1. 在语句中使用 yield 关键字,表示在该关键字所在的方法、运算符或 get 访问器是迭代器。 通过使用 yield 定义迭代器,可在实现自定义集合类型的 IEnumerable 和 IEnumerator 模式时无需其他显式类

    2.yield return 用于返回IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T>,一次返回一个元素。yield break用于终止循环遍历。

    3. 通过 foreach 语句或 LINQ 查询来使用迭代器方法。 foreach 循环的每次迭代都会调用迭代器方法。 迭代器方法运行到 yield return 语句时,会返回一个 expression,并保留当前在代码中的位置。 当下次调用迭代器函数时执行从该位置重新启动。
   4. 可以使用 yield break 语句来终止迭代。

   5.迭代器的声明必须满足以下要求:

    返回类型必须为 IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T>。

    该声明不能有任何 ref 或out参数。

    6.不能在具有以下特点的方法中包含 yield return 或 yield break 语句:

    匿名方法。
    包含不安全的块的方法

    7.异常处理:

     不能将 yield return 语句置于 try-catch 块中。 可将 yield return 语句置于 try-finally 语句的 try 块中。

    yield break 语句可以位于 try 块或 catch 块,但不能位于 finally 块。

    如果 foreach 主体(在迭代器方法之外)引发异常,则将执行迭代器方法中的 finally 块。

    8.举例:

    

      public static IEnumerable<int> Power1(int number, int exponent)
        {
            List<int> list = new List<int>();
            int result = 1;
            for (int i = 0; i < exponent; i++)
            {
                result = result * number;
                list.Add(result);
            }
            return list;
        }

       public static IEnumerable<int> Power2(int number, int exponent)
        {
            int result = 1;
            for (int i = 0; i < exponent; i++)
            {
                result = result * number;
                yield return result;
            }
        }

 static void Main(string[] args)
        {
            //IEnumerable<int> list = Power1(2, 8);
<pre name="code" class="csharp">            IEnumerable<int> list = Power2(2, 8);
 foreach (int l in list) { Console.WriteLine("{0}",l); } }

虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。

当调用power2时,并不立即执行该方法,在foreach循环时,将为list调用MonveNext方法,此时才执行Power2方法,知道下一个yield return语句,yield return语句返回的表达式不仅决定了循环体使用的l变量值,还决定了元素的Current属性值(它是IEnumerable<int>类型)。

使用yield return为什么能保证每次循环遍历的时候从前一次停止的地方开始执行呢?--因为,编译器会生成一个状态机来维护迭代器的状态。

9.总结:当希望获取一个IEnumerable<T>类型的集合,而不想把数据一次性加载到内存,就可以考虑使用yield return实现"按需供给"。

版权声明:本文为博主原创文章,未经博主允许不得转载。

C#yield return和yield break函数执行逻辑理解

1.使用要求:  1)你不能在具有以下特点的方法中包含 yield return 或 yield break 语句:     匿名方法。 有关详细信息,请参阅匿名方法(C# 编程指南)。     包含...
  • Blues1021
  • Blues1021
  • 2015年10月01日 13:07
  • 8578

简单总结协程Coroutine及Yield常见用法

yield return返回值、协程Coroutine常见用法
  • qq_18995513
  • qq_18995513
  • 2016年07月18日 19:07
  • 2139

Unity协程的yield & C#的yield关键字

Unity协程的yield & C#的yield关键字 1.Unity协程: 这里说的是Unity中通过StartCoroutine开启IEnumerator协程里的yield相关: 1.yield...
  • qq_33337811
  • qq_33337811
  • 2017年06月22日 17:21
  • 569

Unity3D yield的总结

可以把yield理解成一种特殊形式的return,它和return一样,会立即把执行权返回父级函数。特别之处在于,yield后面跟的函数或对象会跟一个条件判断,当条件满足时,就会再次回调包含该yiel...
  • huang9012
  • huang9012
  • 2014年05月23日 10:36
  • 6065

python中yield和return对比

相同点功能都是返回程序执行结果区别yield返回执行结果并不中断程序执行,return在返回执行结果的同时中断程序执行。...
  • zsl10
  • zsl10
  • 2016年09月28日 16:22
  • 2506

对yield return的理解

在学习unity3d的时候很容易看到下面这个例子: 1 void Start () { 2 StartCoroutine(Destroy()); 3 } 4 5 IEnumerat...
  • zzmkljd
  • zzmkljd
  • 2016年05月24日 22:21
  • 519

C# yield return 的作用

msdn介绍: http://msdn.microsoft.com/zh-cn/library/9k7k7cf0.aspx DEMO源码: using System; using System....
  • linjf520
  • linjf520
  • 2014年02月12日 18:40
  • 10757

Unity中 yield return 1 的误区

yield return 1的误区
  • HeBiReChenAi
  • HeBiReChenAi
  • 2015年09月13日 21:42
  • 3443

IEnumerator/ IEnumerable/ yield return/ StartCoroutine 详解

IEnumerator/ IEnumerablepublic interface IEnumerable { IEnumerator GetEnumerator(); } ...
  • qp120291570
  • qp120291570
  • 2015年04月20日 14:07
  • 2953

协程与yield表达式

在函数内,yield语句还可以用作出现在赋值运算符右边的表达式,例如: def receiver(): print "Ready to receive" while True: ...
  • liguo9860
  • liguo9860
  • 2011年10月26日 10:48
  • 5058
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# yield return 和 yield break
举报原因:
原因补充:

(最多只允许输入30个字)