具体来说,如果我说:
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(); } }
编译器如何从中生成具体的可枚举类?
解决方法
它构建一个状态机,基本上:
>它创建一个私有嵌套类,其实例变量对应于方法中的局部变量,以及一个状态变量,用于跟踪它到达的位置
>状态机实现IEnumerable< T>和IEnumerator< T> – MoveNext()方法到达逻辑的正确位(基于状态)并设置实例变量以跟踪最后产生的值(Current属性)
>编译器创建一个“骨架”方法,其签名与原始签名相同,从而创建状态机的实例
有关详细信息,请参见my article on the topic.另请注意,C#5中的async / await是使用许多相同的想法构建的(尽管存在各种实现差异).