非虹 发表于 2023-7-18 01:13:06

解读 --- yield 关键字

引言

yield关键字是 C# 中的一种语言特性,用于在枚举器中简化迭代器的实现。它使得开发人员可以通过定义自己的迭代器来简化代码,而不必手动实现 IEnumerable 和 IEnumerator 接口。
使用 yield 关键字,可以将迭代器中的值一次一个地返回,而不必使用一个集合对象存储所有的值。当执行到yield return语句时,代码将会暂停执行,将返回值传递给迭代器的调用者,并将迭代器的状态保存下来。当下一次调用MoveNext方法时,代码将从之前的暂停点继续执行,直到遇到下一个yield return语句或者迭代器结束。
接下来探索一下 yield 的三种玩法:
初级

例如通过 yield 创建出一个 IEnumerable 以供 foreach 遍历,代码如下:
internal class Program
{
    static void Main(string[] args)
    {
      foreach (int i in EvenSequence(5, 18))
      {
            Console.Write(i + " ");
      }

      Console.ReadKey();
    }
   
    static IEnumerable<int> EvenSequence(int start, int end)
    {
      for (int i = start; i <= end; i++)
      {
            if (i % 2 == 0)
            {
                yield return i;
            }
      }
    }
}开始舀水,代码如下:
public class Program
{
    public static void Main(string[] args)
    {
      AsynchronousIterate();

      Console.ReadLine();
    }

    public static async void AsynchronousIterate()
    {
      await foreach (var number in GenerateNumbersAsync())
      {
            Console.WriteLine(number);
      }
    }


    public static async IAsyncEnumerable<int> GenerateNumbersAsync()
    {
      for (int i = 0; i < 10; i++)
      {
            await Task.Delay(1000);

            yield return i;
      }
    }

}最终会每次随机舀水,花费随机时间,水全部舀完。
输出:
static Random Random = new Random();

/// <summary>
/// 假设水缸能盛水90~100
/// </summary>
public static int GetOneWaterTankCapacity()
{
    return Random.Next(150, 200);
}

/// <summary>
/// 假设水瓢一次只能舀水2~5
/// </summary>
public static int GetOneWaterLadleCapacity()
{
    return Random.Next(2, 5);
}

/// <summary>
/// 模拟舀水所消耗的时间(0.5s~2S)
/// </summary>
/// <returns></returns>
public static async Task<int> ScoopingWater()
{
    await Task.Delay(Random.Next(500, 2000));
    return GetOneWaterLadleCapacity();
}通过上文例子,可以更深入理解 yield 创建的异步生成器。
总结


[*]使用 yield 关键字可以将一个方法转换为一个返回可枚举对象或迭代器的方法,而不必手动实现 IEnumerable 和 IEnumerator 接口
[*]使用 yield 来创建异步生成器,在某些场景下可以实现更高效、可靠的异步编程。

来源:https://www.cnblogs.com/pandefu/archive/2023/07/17/17536297.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 解读 --- yield 关键字