C# yield
キーワード: イテレーターとパフォーマンスの最適化
yield
キーワードは C# で重要な役割を果たし、列挙子の実装とイテレータの作成を簡素化し、コードの読みやすさとパフォーマンスを大幅に向上させます。その特徴を詳しく見てみましょう。
結果を段階的に返します (Yielding Results
)
yield
キーワードを使用すると、メソッドの実行を一時停止して、段階的に結果を返すことができます。呼び出し元の関数が IEnumerable
インターフェイスを実装するオブジェクトを反復処理する場合、yield
キーワードを含むメソッドは戻りシーケンスが終了するまで繰り返し呼び出されます。このメカニズムは「イールド」と呼ばれます。
たとえば、次のコード スニペットを考えてみましょう:
<code class="language-csharp">IEnumerable<object> FilteredList() { foreach (object item in FullList) { if (IsItemInPartialList(item)) yield return item; } }</code>
FilteredList()
メソッドは、条件に基づいて FullList
からオブジェクトを段階的に返します。呼び出し元が結果を反復処理すると、メソッドは各一致を 1 つずつ返します。
イテレーター (Implementing Iterators
) を実装します
yield
キーワードを使用すると、カスタム反復子の作成が簡単になります。 C# の以前のバージョンでは、IEnumerator
オブジェクトを使用して列挙子を手動で実装する必要がありました。 yield
は、よりクリーンで宣言的なアプローチを提供します。
<code class="language-csharp">public IEnumerable<int> Integers() { yield return 1; yield return 2; yield return 4; yield return 8; yield return 16; yield return 16777216; }</code>
このコードは、明示的な反復ロジックを使用せずに一連の整数を返します。
実用化 (Real-Life Usage
)
実際のアプリケーションでは、yield
はデータベースからのデータの取得などの遅延評価シナリオでよく使用されます。次の例を考えてみましょう:
<code class="language-csharp">public IEnumerable<T> Read<T>(string sql, Func<IDataReader, T> make, params object[] parms) { using (var connection = CreateConnection()) { using (var command = CreateCommand(CommandType.Text, sql, connection, parms)) { command.CommandTimeout = dataBaseSettings.ReadCommandTimeout; using (var reader = command.ExecuteReader()) { while (reader.Read()) { yield return make(reader); } } } } }</code>
このメソッドは列挙子を構築し、データベース テーブルからレコードを取得し、提供されたマッピング関数 make()
に基づいてタイプ T のオブジェクトを作成します。 yield
を使用することで、このメソッドは結果セット全体をメモリにロードすることを回避し、大規模なデータ セットを処理する際のパフォーマンスを向上させます。
以上がC# で「yield」キーワードはどのように機能してイテレータを作成し、パフォーマンスを向上させますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。