Yield 是 C# 中的上下文關鍵字。上下文關鍵字是 C# 中不為整個程式保留的關鍵字。相反,它們是程式某些部分的保留關鍵字,可以在其中相關地使用關鍵字。只要這些關鍵字的相關性不會向編譯器傳達任何特殊意義,這些關鍵字就可以用作有效標識符。
yield 關鍵字表示包含該關鍵字的方法或存取器是迭代器方法/存取器。迭代器方法/訪問器是不傳回單一值的方法/訪問器。相反,它在迭代中被調用,並在每次迭代中返回不同的值。
文法
yield 關鍵字的語法非常簡單。您只需在方法或存取器的 return 語句之前指定關鍵字。
yield return <expression>;
或
yield break;
這是關鍵字的兩種實作。當與 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; } } }
下面的範例將yield關鍵字與get存取器結合使用。
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 語句一次回傳一個。
2) 傳回型別必須是 IEnumerable 或 IEnumerator。
3)不能將in、ref或out關鍵字與yield一起使用。
4) Yield 關鍵字不能與 Lambda 表達式或匿名方法一起使用。
5)yield return 語句不能位於 try-catch 區塊內。它可以位於 try-finally 區塊內。
6) Yield Break 語句不能位於 try-finally 區塊內。它可以位於 try-catch 區塊內。
yield 關鍵字無需建立臨時集合。在從方法返回資料之前,您無需建立臨時集合來儲存資料。此外,方法的執行狀態被保留,因此不需要明確儲存在程式碼中。
從這篇文章中我們了解到如何yield關鍵字是C#中一個非常有用的關鍵字。它有助於用盡可能少的行程式碼編寫複雜的問題,並且使程式碼易於理解。這是一篇關於 C# 之旅的高級文章。建議嘗試在程式碼中使用關鍵字,以便獲得一些實踐練習。
以上是C# 中的 Yield 關鍵字的詳細內容。更多資訊請關注PHP中文網其他相關文章!