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)による列挙を実現します。必要なタイミングで必要な要素だけを順次生成するため、すべての要素を事前にメモリへ展開する場合と比べて、大幅に効率的な処理が可能になります。
-
C#の「new」キーワードとは?使い方をわかりやすく解説
C#における「new」キーワードは、主にオブジェクト(インスタンス)の生成や配列の作成に使用されます。この記事では、newキーワードの基本的な役割と、実際のコード例を使った具体的な使い方を解説します。配列を作成する際のnewキーワードnewキーワードを使用すると、配列のインスタンスを作成できます。以下のように記述します。int[] a = new int[5];この例では、int型の要素を5つ持つ配列がメモリ上に確保され、変数aに割り当てられます。オブジェクトを生成する際のnewキーワードnew演算子は、クラスからオブジェクトを生成(インスタンス化)するために使われます。次の例では、Numbe
-
C#のsizeof演算子とは?データ型のサイズを取得する方法
C#のsizeof()演算子は、指定したデータ型が占めるサイズ(バイト数)を返します。組み込みの値型に対して使用でき、メモリ管理やパフォーマンスの最適化を行う際に役立ちます。例えば、int型のサイズを調べたい場合は次のように記述します。sizeof(int);double型の場合は以下のとおりです。sizeof(double);サンプルコードそれでは、さまざまなデータ型のサイズを実際に確認できる完全な例を見てみましょう。using System; namespace Demo { class Program { static void Main(string[]