加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 编译器如何使用’yield return’来构建类

发布时间:2020-12-15 08:15:12 所属栏目:百科 来源:网络整理
导读:具体来说,如果我说: public static IEnumerableString Data() { String connectionString = "..."; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); IDataReader reader = new SqlCommand("",connection).Ex
具体来说,如果我说:
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是使用许多相同的想法构建的(尽管存在各种实现差异).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读