Yield は、C# のコンテキスト キーワードです。コンテキスト キーワードは、完全なプログラム用に予約されていない C# のキーワードです。むしろ、これらは、キーワードを適切に使用できるプログラムの特定の部分用に予約されたキーワードです。これらのキーワードは、その関連性がコンパイラに特別な意味を伝えない限り、有効な識別子として使用できます。
yield キーワードは、キーワードを含むメソッドまたはアクセサーがイテレータ メソッド/アクセサーであることを示します。イテレータ メソッド/アクセサは、単一の値を返さないメソッド/アクセサです。むしろ、反復で呼び出され、反復ごとに異なる値を返します。
構文
yield キーワードの構文は非常に単純です。メソッドまたはアクセサーの return ステートメントの前にキーワードを指定するだけです。
yield return <expression>;
または
yield break;
これらはキーワードの 2 つの実装です。 return ステートメントで使用すると、yield キーワードは、式の終了条件が満たされるまで、式から計算された次の値を返します。 Break キーワードと一緒に使用すると、yield キーワードは反復を中断し、プログラムの実行がメソッド/アクセサーから行われます。
いくつかの例を考えてみましょう:
以下の例では、yield キーワードを使用してフィボナッチ数列を生成します。
using System; using System.Collections.Generic; public class Program { public static void Main() { foreach (int ele in GetFibonacciSeries(10)) { Console.Write(ele + "\t"); } } public static IEnumerable<int> GetFibonacciSeries(int x) { for (int a = 0, b = 0, c = 1; a < x; a++) { yield return b; int temp = b + c; b = c; c = temp; } } }
次の例では、get アクセサーで yield キーワードを使用します。
using System; using System.Collections.Generic; public class Program { public static void Main() { foreach (Day day in new Days().DaysOfWeek) { Console.WriteLine("Day {0} of the week is {1}", day.DayOfWeek, day.DayName); } } public static IEnumerable<int> Show(int x) { for (int a = 0, b = 0, c = 1; a < x; a++) { yield return b; int temp = b + c; b = c; c = temp; } } public class Days { public IEnumerable<Day> DaysOfWeek { get { yield return new Day{DayName = "Sunday", DayOfWeek = 1}; yield return new Day{DayName = "Monday", DayOfWeek = 2}; yield return new Day{DayName = "Tuesday", DayOfWeek = 3}; yield return new Day{DayName = "Wednesday", DayOfWeek = 4}; yield return new Day{DayName = "Thursday", DayOfWeek = 5}; yield return new Day{DayName = "Friday", DayOfWeek = 6}; yield return new Day{DayName = "Saturday", DayOfWeek = 7}; } } } public class Day { public string DayName { get; set; } public int DayOfWeek { get; set; } } }
次の例は、yield Break ステートメントの使用法を示しています。反復は、系列内の数値が見つかるか、最大検索制限に達するとすぐに終了します。
using System; using System.Collections.Generic; public class Program { public static void Main() { int elementToFind = 21; int maxElements = 100; foreach (int ele in FindFibonacciNumber(elementToFind, maxElements)) { Console.Write("Found the number " + elementToFind + " in Fibonacci series."); } } public static IEnumerable<int> FindFibonacciNumber(int n, int max) { for (int a = 0, b = 0, c = 1; true; a++) { if (a > max) { Console.Write("Searched first " + max + " Fibonacci numbers. Element " + n + " not found"); yield break; } if (b == n) { yield return b; yield break; } int temp = b + c; b = c; c = temp; } } }
elementToFind 1234 を変更すると、出力は –
になります。1) 各要素は、yield return ステートメントを使用して一度に 1 つずつ返される必要があります。
2) 戻り値の型は IEnumerable または IEnumerator である必要があります。
3) yield とともに in、ref、または out キーワードで使用することはできません。
4) Yield キーワードは、ラムダ式または匿名メソッドでは使用できません。
5) yield return ステートメントを try-catch ブロック内に置くことはできません。 try-finally ブロック内に置くことができます。
6) yield Break ステートメントを try-finally ブロック内に置くことはできません。 try-catch ブロック内に含めることができます。
yield キーワードを使用すると、一時的なコレクションを作成する必要がなくなります。データがメソッドから返される前に、データを保存するための一時コレクションを作成する必要はありません。また、メソッドの実行状態は保持されるため、コードに明示的に保存する必要はありません。
この記事から、キーワードを生成する方法が C# で非常に便利なキーワードであることがわかりました。これにより、複雑な問題をできるだけ少ない行でコーディングできるようになり、コードが理解しやすくなります。これは C# の取り組みに関する上級レベルの記事でした。実践的な練習をするために、コード内でキーワードを使用してみることをお勧めします。
以上がC# の Yield キーワードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。