yield (C# 參考)
yield 關鍵字會對編譯器 (Compiler) 發出方法似乎為 Iterator 區塊的信號。 編譯器會產生類別以實作以 Iterator 區塊表示的行為。 在 Iterator 塊區中,yield 關鍵字會與 return 關鍵字一併使用,如此可以提供值給列舉值物件或表示反覆運算的結束。 例如,這是每一個 foreach 陳述式迴圈中所傳回的值。 yield 關鍵字也會與 break 搭配使用,以發出表示反覆運算結束的信號。 如需 Iterator 的詳細資訊,請參閱 Iterator (C# 程式設計手冊)。 下列程式碼範例示範兩種形式的 yield 陳述式。
yield return <expression>;
yield break;
備註
在 yield 的傳回陳述式中,會針對 expression 進行評估,並且當做一個值傳回給列舉值物件;expression 必須可隱含轉換為 Iterator 的 yield 型別。
在 yield break 陳述式中,控制項會無條件的傳回給 Iterator 的呼叫端,該 Iterator 為列舉程式物件的 IEnumerator.MoveNext 方法 (或它本身的泛型 System.Collections.Generic.IEnumerable<T> 對應項目) 或 Dispose 方法。
yield 陳述式只能夠出現在 iterator 區塊中,而該區塊可以實作為方法、運算子或存取子 (Accessor) 等的主體。 這種方法、運算子或存取子的主體受以下限制:
不容許 Unsafe 區塊。
yield 回傳陳述式絕對不可以置於 try-catch 區塊中。 如果 try 區塊後面跟著一個 finally 區塊,yield 回傳陳述式才可以置於 try 區塊中。
yield break 陳述式可以置於 try 區塊或 catch 區塊中,但是 finally 區塊則否。
yield 陳述式不能出現於匿名方法 (Anonymous Method) 中。 如需詳細資訊,請參閱匿名方法 (C# 程式設計手冊)。
yield return 陳述式與 expression 一起使用時,不可以在 catch 區塊或在擁有一個或多個 catch 子句的 try 區塊中出現。 如需詳細資訊,請參閱例外處理陳述式 (C# 參考)。
範例
在下列範例中,yield 陳述式用於 Iterator 區塊中,此區塊是 Power(int number, int power) 方法。 叫用 (Invoke) Power 方法時,它會傳回包含數字乘冪的列舉值物件。 請注意,Power 方法的傳回型別為 System.Collections.IEnumerable,這是 Iterator 介面型別 (Interface Type)。
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# 語法和用法的決定性來源。