共用方式為


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 區塊。

  • 方法、運算子或存取子的參數不能是 refout

  • 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# 語法和用法的決定性來源。

請參閱

參考

foreach、in (C# 參考)

使用 Iterator (C# 程式設計手冊)

概念

C# 程式設計手冊

其他資源

C# 參考