反復子 (C# プログラミング ガイド)
更新 : 2007 年 11 月
反復子はメソッド、get アクセサ、演算子のいずれかで、yield キーワードを使用して配列またはコレクション クラスに対してカスタム設定した反復を実行します。yield return ステートメントを使用すると、ソース シーケンス内の要素は、次の要素へのアクセスの前に、直ちに呼び出し元に戻されます。反復子をメソッドとして記述しても、コンパイラが入れ子のクラス、つまり事実上ステート マシンに変換します。このクラスは、クライアント コードで foreach ループが続く限り、反復子の位置を追跡します。
メモ : |
---|
コンパイラがバックグラウンドで行う作業を表示するには、ILDASM.exe ツールを使用して、反復子メソッドに生成される中間言語 (IL) コードを表示します。 |
反復子は、foreach ステートメントを使用してクライアント コードから呼び出されます。たとえば、逆の順番で要素を戻すクラス、または反復子が要素を戻す前に各要素で操作を実行するクラス用の反復子を作成できます。クラスまたは構造体用の反復子を作成する場合、IEnumerator インターフェイス全体を実装する必要はありません。コンパイラは、反復子を検出すると、IEnumerator インターフェイスまたは IEnumerator<T> インターフェイスの Current メソッド、MoveNext メソッド、および Dispose メソッドを自動的に生成します。
反復子の概要
反復子は、順序付けされた同じ型の一連の値を返すコードのセクションです。
反復子は、メソッド、演算子、または get アクセサの本体として使用できます。
反復子コードでは、yield return ステートメントを使用して、各要素を順に返します。反復処理は、yield break で終了します。
複数の反復子を 1 つのクラスに実装できます。各反復子は、他のクラス メンバと同様に一意の名前を持つ必要があり、"foreach(int x in SampleClass.Iterator2){}" のように、foreach ステートメント内でクライアント コードによって呼び出すことができます。
反復子の戻り値の型は、IEnumerable、IEnumerator、IEnumerable<T>、または IEnumerator<T> である必要があります。
反復子は、LINQ クエリの遅延実行動作の基礎になります。
yield キーワードを使用して、単数または複数の戻り値を指定します。yield return ステートメントに到達すると、現在の位置が保存されます。次回、反復子が呼び出されると、この位置から実行が再開されます。
反復子は、特にコレクション クラスで役立ち、バイナリ ツリーなどの複雑なデータ構造体を簡単に反復処理できるようにします。
関連項目
詳細情報
使用例
次の例の DaysOfTheWeek クラスは、曜日を文字列として格納する単純なコレクション クラスです。foreach ループを反復処理するたびに、コレクション内の次の文字列が返されます。
public class DaysOfTheWeek : System.Collections.IEnumerable
{
string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
public System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < days.Length; i++)
{
yield return days[i];
}
}
}
class TestDaysOfTheWeek
{
static void Main()
{
// Create an instance of the collection class
DaysOfTheWeek week = new DaysOfTheWeek();
// Iterate with foreach
foreach (string day in week)
{
System.Console.Write(day + " ");
}
}
}
// Output: Sun Mon Tue Wed Thr Fri Sat
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
- 10.14 反復子