首頁 >後端開發 >C#.Net教程 >C# 中的 Yield 關鍵字

C# 中的 Yield 關鍵字

王林
王林原創
2024-09-03 15:26:44354瀏覽

Yield 是 C# 中的上下文關鍵字。上下文關鍵字是 C# 中不為整個程式保留的關鍵字。相反,它們是程式某些部分的保留關鍵字,可以在其中相關地使用關鍵字。只要這些關鍵字的相關性不會向編譯器傳達任何特殊意義,這些關鍵字就可以用作有效標識符。

yield 關鍵字表示包含該關鍵字的方法或存取器是迭代器方法/存取器。迭代器方法/訪問器是不傳回單一值的方法/訪問器。相反,它在迭代中被調用,並在每次迭代中返回不同的值。

文法

yield 關鍵字的語法非常簡單。您只需在方法或存取器的 return 語句之前指定關鍵字。

yield return <expression>;

yield break;

這是關鍵字的兩種實作。當與 return 語句一起使用時,yield 關鍵字會傳回根據表達式計算的下一個值,直到滿足表達式的退出條件。當與break關鍵字一起使用時,yield關鍵字會中斷迭代,程式的執行將脫離方法/存取器。

Yield 關鍵字在 C# 中如何運作?

  1. 那麼,C#中的關鍵字詞是怎麼表示的呢? C#編譯器中關鍵字的內部實作是怎麼樣的?讓我們來了解一下。包含yield 關鍵字的方法可以由迭代器循環(例如foreach 或LINQ 查詢)使用。循環的每次迭代都會呼叫該方法。方法中的程式碼會一直執行,直到遇到yield return或yield break語句。
  2. 方法中執行的目前位置將被保留,下一次迭代將從上一次迭代中停止的位置繼續。
  3. 這很簡單,不是嗎?讓我們來看看它的技術實現。包含yield關鍵字的方法必須永遠傳回IEnumerable或IEnumerator。每當編譯器遇到yield關鍵字時,它就知道方法被迭代器使用。當方法被呼叫時,編譯器不會像平常那樣執行方法體。
  4. 相反,它執行方法主體並將一組已編譯的 IEnumerable 傳回給使用的迭代器變數。每次呼叫方法時,編譯器都會尋找yield 語句並在該語句處暫停執行。循環的下一次迭代從上次暫停的位置繼續執行。這會持續到迴圈的退出條件或yieldbreak語句為止。為了在每次迭代後儲存狀態訊息,編譯器會建立一個狀態機。

C# 中的 Yield 關鍵字範例

讓我們考慮一些例子:

範例 #1 – 方法

下面的範例使用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;
}
}
}

C# 中的 Yield 關鍵字

範例 #2 – 存取器

下面的範例將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; }
}
}

C# 中的 Yield 關鍵字

範例 #3 – 屈服點

以下範例示範了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;
}
}
}

C# 中的 Yield 關鍵字

如果我們更改 elementToFind 1234,輸出將是 –

C# 中的 Yield 關鍵字

規則

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 關鍵字無需建立臨時集合。在從方法返回資料之前,您無需建立臨時集合來儲存資料。此外,方法的執行狀態被保留,因此不需要明確儲存在程式碼中。

結論 – C# 中的 Yield 關鍵字

從這篇文章中我們了解到如何yield關鍵字是C#中一個非常有用的關鍵字。它有助於用盡可能少的行程式碼編寫複雜的問題,並且使程式碼易於理解。這是一篇關於 C# 之旅的高級文章。建議嘗試在程式碼中使用關鍵字,以便獲得一些實踐練習。

以上是C# 中的 Yield 關鍵字的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn