Share via


yield (C# 參考)

當您在陳述式時使用 yield 關鍵字,則表示它所在的方法、運算子或 get 存取子是 Iterator。 您可以使用 Iterator 對集合的自訂反覆項目。 以下範例說明 yield 陳述式的兩個表單。

yield return <expression>;
yield break;

備註

您可以使用 yield return 陳述式會傳回每個項目一次一個。

您可以使用 foreach 陳述式或 LINQ 查詢,您使用 Iterator 方法。 foreach 迴圈的每次查看呼叫 Iterator 方法。 執行 yield return 陳述式在 Iterator 方法時到達,則會傳回 expression ,因此,目前位置在程式碼中保留。 執行從該位置下次重新啟動 Iterator 函式呼叫。

您可以使用 yield break 陳述式結束反覆運算。

如需 Iterator 的詳細資訊,請參閱 Iterator (C# 和 Visual Basic)

Iterator 方法和 get 存取子

Iterator 的宣告必須符合下列需求:

隱含轉換必須從運算式的型別在 yield return 陳述式的存在於 Iterator 的傳回型別。

在具有下列特性的方法不可以包含 yield return 或 yield break 陳述式:

例外狀況處理

yield return 陳述式不能位於 try-catch 區塊。 yield return 陳述式可以位於 try-finally 陳述式的 try 區塊。

yield break 陳述式可以最後位於 try 區塊或 catch 區塊,但不是一個區塊。

如果 foreach 主體 (在 Iterator 方法之外) 會擲回例外狀況,在 Iterator 方法的 finally 執行區塊。

技術實作

下列程式碼會從 Iterator 方法的 IEnumerable<string> 傳遞的項目集合。

IEnumerable<string> elements = MyIteratorMethod();
foreach (string element in elements)
{
   …
}

對 MyIteratorMethod 的呼叫不會實作方法的主體。 反而呼叫傳回 IEnumerable<string> 加入至 elements 變數中。

在 foreach 迴圈的反覆項目, MoveNext 方法會呼叫 elements。 這稱為執行 MyIteratorMethod 主體,直到下一個 yield return 陳述式為止。 yield return 陳述式傳回的運算式是由迴圈主體判斷 element 變數的不僅值使用的,而且項目的 Current 屬性,則為 IEnumerable<string>

在 foreach 迴圈的每個後續反覆項目, Iterator 主體的執行與繼續它停止的地方,再停止,並在到達 yield return 陳述式。 當 Iterator 方法或 yield break 陳述式的結尾到達, foreach 迴圈完成。

範例

下列範例會在 for 迴圈中的 yield return 陳述式。 foreach 陳述式主體的每個反覆項目在 Process 建立呼叫 Power Iterator 函式。 將 Iterator 函式的每個呼叫執行 yield return 陳述式的下執行,迴圈會出現在 for 下一個反覆項目時。

Iterator 方法的傳回型別是 IEnumerable,這是 Iterator 介面型別。 當 Iterator 方法呼叫時,它會傳回可列舉的物件包含數字的階乘冪。

public class PowersOf2
{
    static void Main()
    {
        // Display powers of 2 up to the exponent of 8:
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }

    public static System.Collections.IEnumerable Power(int number, int exponent)
    {
        int result = 1;

        for (int i = 0; i < exponent; i++)
        {
            result = result * number;
            yield return result;
        }
    }

    // Output: 2 4 8 16 32 64 128 256
}

下列範例示範是 Iterator 的 get 存取子。 在此範例中,每個 yield return 陳述式會傳回使用者定義的類別的執行個體。

public static class GalaxyClass
{
    public static void ShowGalaxies()
    {
        var theGalaxies = new Galaxies();
        foreach (Galaxy theGalaxy in theGalaxies.NextGalaxy)
        {
            Debug.WriteLine(theGalaxy.Name + " " + theGalaxy.MegaLightYears.ToString());
        }
    }

    public class Galaxies
    {

        public System.Collections.Generic.IEnumerable<Galaxy> NextGalaxy
        {
            get
            {
                yield return new Galaxy { Name = "Tadpole", MegaLightYears = 400 };
                yield return new Galaxy { Name = "Pinwheel", MegaLightYears = 25 };
                yield return new Galaxy { Name = "Milky Way", MegaLightYears = 0 };
                yield return new Galaxy { Name = "Andromeda", MegaLightYears = 3 };
            }
        }

    }

    public class Galaxy
    {
        public String Name { get; set; }
        public int MegaLightYears { get; set; }
    }
}

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格。語言規格是 C# 語法和用法的限定來源。

請參閱

參考

foreach、in (C# 參考)

概念

C# 程式設計手冊

其他資源

C# 參考

Iterator (C# 和 Visual Basic)