C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のyield returnとは?使い方と動作の仕組みをわかりやすく解説

C#のyieldキーワードを使うと、コレクションに対して「状態を保持しながら」独自の反復処理(ステートフルなイテレーション)を行うことができます。つまり、yieldキーワードを使用すると、呼び出し元のメソッドとデータ元の間で制御が行き来するのです。

サンプルコード

using System;
using System.Collections.Generic;
namespace DemoApplication {
    class Program {
        static List<int> numbersList = new List<int> {
            1, 2, 3, 4, 5
        };
        public static void Main() {
            foreach(int i in RunningTotal()) {
                Console.WriteLine(i);
            }
            Console.ReadLine();
        }
        public static IEnumerable<int> RunningTotal() {
            int runningTotal = 0;
            foreach(int i in numbersList) {
                runningTotal += i;
                yield return (runningTotal);
            }
        }
    }
}

実行結果

上記プログラムの出力は以下の通りです。

1
3
6
10
15

動作の仕組み

この例では、Mainメソッド内のforeachループが、RunningTotalメソッドから返される累積値のシーケンスを順番に処理しています。yield returnが実行されるたびに、制御は一時的にMainメソッド側のforeachループへ戻り、その時点の値が出力されます。値を出力し終えると、再びRunningTotalメソッド内のforeachループへ制御が移り、処理が続行されます。

ここで注目すべき点は、前回の変数の状態(runningTotalの値)が保持されていることです。通常のメソッドであれば、制御が戻るたびにローカル変数は破棄されますが、yieldを使ったイテレータでは実行状態が保存されるため、累積計算のような処理が自然に記述できます。

まとめると、yieldキーワードはコレクションの要素に対して遅延評価(Lazy Evaluation)による列挙を実現します。必要なタイミングで必要な要素だけを順次生成するため、すべての要素を事前にメモリへ展開する場合と比べて、大幅に効率的な処理が可能になります。

  1. C#の「new」キーワードとは?使い方をわかりやすく解説

    C#における「new」キーワードは、主にオブジェクト(インスタンス)の生成や配列の作成に使用されます。この記事では、newキーワードの基本的な役割と、実際のコード例を使った具体的な使い方を解説します。配列を作成する際のnewキーワードnewキーワードを使用すると、配列のインスタンスを作成できます。以下のように記述します。int[] a = new int[5];この例では、int型の要素を5つ持つ配列がメモリ上に確保され、変数aに割り当てられます。オブジェクトを生成する際のnewキーワードnew演算子は、クラスからオブジェクトを生成(インスタンス化)するために使われます。次の例では、Numbe

  2. C#のsizeof演算子とは?データ型のサイズを取得する方法

    C#のsizeof()演算子は、指定したデータ型が占めるサイズ(バイト数)を返します。組み込みの値型に対して使用でき、メモリ管理やパフォーマンスの最適化を行う際に役立ちます。例えば、int型のサイズを調べたい場合は次のように記述します。sizeof(int);double型の場合は以下のとおりです。sizeof(double);サンプルコードそれでは、さまざまなデータ型のサイズを実際に確認できる完全な例を見てみましょう。using System; namespace Demo { class Program { static void Main(string[]