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 に答える