6

具体来说,如果我说:

    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();
        }
    }

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

4

1 回答 1

9

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

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

有关更多详细信息,请参阅我关于该主题的文章。另请注意,C# 5 中的 async/await 是用许多相同的想法构建的(尽管存在各种实现差异)。

于 2013-03-11T17:12:04.007 回答