编译器如何使用'yield return'创建一个类

本文关键字:一个 return 何使用 yield 编译器 创建 | 更新日期: 2023-09-27 18:03:34

具体来说,如果我说:

    public static IEnumerable<String> Data()
    {
        String connectionString = "...";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            IDataReader reader = new SqlCommand("", connection).ExecuteReader();
            while (reader.Read())
                yield return String.Format("Have a beer {0} {1}!", reader["First_Name"], reader["Last_Name"]);
            connection.Close();
        }
    }

编译器如何生成一个具体的可枚举类?

编译器如何使用'yield return'创建一个类

它构建了一个状态机,基本上是:

  • 它创建了一个私有嵌套类,其中实例变量对应于方法中的局部变量,以及一个state变量来跟踪它到达
  • 的位置。
  • 状态机实现IEnumerable<T>IEnumerator<T> - MoveNext()方法获得逻辑的正确位(基于state)并设置一个实例变量来跟踪最后产生的值(Current属性)
  • 编译器创建一个与原始签名相同的"骨架"方法,它创建一个状态机的实例

有关更多细节,请参阅我关于该主题的文章。还要注意的是,c# 5中的async/await是用很多相同的思想构建的(尽管在实现上有很多不同)。