yield (C# リファレンス)
yield キーワードを使用すると、そのメソッドが反復子ブロックであることがコンパイラに通知されます。 反復子ブロック内で指定した動作を実装するクラスが、コンパイラにより生成されます。 反復子ブロックで yield キーワードを return キーワードと共に使用すると、列挙子オブジェクトに値を挿入できます。 これは、たとえば foreach ステートメントのループごとに返される値です。 また、yield キーワードを break と共に使用すると、反復処理の終了を通知できます。 反復子の詳細については、「反復子 (C# プログラミング ガイド)」を参照してください。 yield ステートメントの 2 つの形式を次の例に示します。
yield return <expression>;
yield break;
解説
yield return ステートメントでは、expression が列挙子オブジェクトの値として評価され、返されます。expression は、反復子の yield 型に暗黙に変換できる必要があります。
yield break ステートメントでは、制御が反復子の呼び出し元に無条件に戻ります。この呼び出し元は、IEnumerator.MoveNext メソッド (またはそのジェネリックである System.Collections.Generic.IEnumerable<T>) または列挙子オブジェクトの Dispose メソッドです。
yield ステートメントは、メソッド、演算子、またはアクセサーの本体として実装できる iterator ブロック内でのみ使用できます。 このようなメソッド、演算子、またはアクセサーの本体は、次の制約によって制御されます。
unsafe ブロックは使用できません。
yield return ステートメントは、try-catch ブロック内で使用できません。 try ブロックの後に finally ブロックが続く場合にのみ、try ブロック内で使用できます。
yield break ステートメントは、try ブロックや catch ブロック内で使用できますが、finally ブロックでは使用できません。
匿名メソッドでは、yield ステートメントを使用できません。 詳細については、「匿名メソッド (C# プログラミング ガイド)」を参照してください。
expression と共に yield return ステートメントを使用する場合、catch ブロックまたは catch 句が 1 つ以上含まれている try ブロック内ではこのステートメントを使用できません。 詳細については、「例外処理ステートメント (C# リファレンス)」を参照してください。
使用例
次に示す例では、yield ステートメントは反復子ブロック (Power(int number, int power) メソッド) 内で使用されています。 Power メソッドが呼び出されると、数値の累乗を含む列挙可能なオブジェクトが返されます。 Power メソッドの戻り値の型が System.Collections.IEnumerable (反復子インターフェイス型) である点に注意してください。
public class List
{
//using System.Collections;
public static IEnumerable Power(int number, int exponent)
{
int counter = 0;
int result = 1;
while (counter++ < exponent)
{
result = result * number;
yield return result;
}
}
static void Main()
{
// Display powers of 2 up to the exponent 8:
foreach (int i in Power(2, 8))
{
Console.Write("{0} ", i);
}
}
}
/*
Output:
2 4 8 16 32 64 128 256
*/
C# 言語仕様
詳細については、「C# 言語仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。