C#中的yield关键字

作者: ShenYj | 来源:发表于2018-10-17 14:07 被阅读22次

    最近一段时间接手维护C#项目, 从GitHub checkout一个项目,无意中看到这样一个关键字, 于是就好奇的搜了下,了解下使用场景

    C# 中的"yield"使用
    MSDN的官方api

    一个方法返回一个IEnumerable 类型结果集(例如返回一个list<int>的结果),通常的代码是这样的

     1         /// <summary>
     2         /// 
     3         /// </summary>
     4         /// <returns></returns>
     5         public IEnumerable<int> Method()
     6         {
     7             List<int> results = new List<int>();
     8             int counter = 0;
     9             int result = 1;
    10 
    11             while (counter++ < 10)
    12             {
    13                 result = result * 2;
    14                 results.Add(result);
    15             }
    16             return results;
    17         }
    

    通过 yield可以简化为:

     1         /// <summary>
     2         /// 
     3         /// </summary>
     4         /// <returns></returns>
     5         public IEnumerable<int> YieldDemo()
     6         {
     7             int counter = 0;
     8             int result = 1;
     9             while (counter++ < 10)
    10             {
    11                 result = result * 2;              
    12                 yield return result;
    13             }
    14         }
    

    两种写法的效果是一样的

    关于这个关键字的其他一些注意点:

    1 不能将 yield return 语句置于 try-catch 块中。 可将 yield return 语句置于 try-finally 语句的 try 块中。
    2 可将 yield break 语句置于 try 块或 catch 块中,但不能将其置于 finally 块中。
    3 如果 foreach 主体(在迭代器方法之外)引发异常,则将执行迭代器方法中的 finally 块。
    4 匿名方法。 有关详细信息,请参阅匿名方法。
    5 包含不安全的块的方法。 有关详细信息,请参阅unsafe。
    

    相关文章

      网友评论

        本文标题:C#中的yield关键字

        本文链接:https://www.haomeiwen.com/subject/pztrzftx.html