ホームページ >バックエンド開発 >C++ >C# で「yield」キーワードはどのように機能してイテレータを作成し、パフォーマンスを向上させますか?

C# で「yield」キーワードはどのように機能してイテレータを作成し、パフォーマンスを向上させますか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-27 17:41:08796ブラウズ

How Does the `yield` Keyword Work in C# to Create Iterators and Improve Performance?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。