yield(C# 參考)

yield(C# 參考)

在語句中使用 yield 關鍵字,表示在該關鍵字所在的方法、運算符或 get 訪問器是迭代器。   經過使用 yield 定義迭代器,可在實現自定義集合類型的 IEnumerableIEnumerator 模式時無需其餘顯式類(保留枚舉狀態的類,有關示例,請參閱 IEnumerator<T>)。  

下面的示例演示了 yield 語句的兩種形式。html

 
複製            
yield return <expression>;
yield break;
備註
 

使用 yield return 語句可一次返回一個元素。express

經過 foreach 語句或 LINQ 查詢來使用迭代器方法。     foreach 循環的每次迭代都會調用迭代器方法。  迭代器方法運行到 yield return 語句時,會返回一個 expression,並保留當前在代碼中的位置。     當下次調用迭代器函數時執行從該位置從新啓動。   編程

可使用 yield break 語句來終止迭代。安全

有關迭代器的詳細信息,請參閱迭代器(C# 和 Visual Basic)app

迭代器的聲明必須知足如下要求:ide

返回 IEnumerableIEnumerator 的迭代器的 yield 類型爲 object。若是迭代器返回 IEnumerable<T>IEnumerator<T>,則必須將 yield return 語句中的表達式類型隱式轉換爲泛型類型參數。ui

你不能在具備如下特色的方法中包含 yield returnyield break 語句:spa

不能將 yield return 語句置於 try-catch 塊中。  可將 yield return 語句置於 try-finally 語句的 try 塊中。  

yield break     語句能夠位於 try 塊或 catch  塊,但不能位於 finally 塊。

若是 foreach 主體(在迭代器方法以外)引起異常,則將執行迭代器方法中的 finally 塊。

如下代碼從迭代器方法返回 IEnumerable<string>,而後遍歷其元素。

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

調用 MyIteratorMethod 並不執行該方法的主體。  相反,該調用會將 IEnumerable<string> 返回到 elements 變量中。  

foreach 循環迭代時,將爲 elements 調用 MoveNext 方法。  此調用將執行 MyIteratorMethod 的主體,直至到達下一個 yield return 語句。     yield return 語句返回的表達式不只決定了循環體使用的 element 變量值,還決定了元素的 Current 屬性(它是 IEnumerable<string>)。  

foreach 循環的每一個後續迭代中,迭代器主體的執行將從它暫停的位置繼續,直至到達 yield return 語句後纔會中止。  在到達迭代器方法的結尾或 yield break 語句時,foreach 循環便已完成。  

示例

下面的示例包含一個位於 for 循環內的 yield return 語句。     Process 中的 foreach 語句體的每次迭代都會建立對 Power 迭代器函數的調用。  對迭代器函數的每一個調用將繼續到 yield return 語句的下一次執行(在 for 循環的下一次迭代期間發生)。  

迭代器方法的返回類型是 IEnumerable(一種迭代器接口類型)。  當調用迭代器方法時,它將返回一個包含數字冪的可枚舉對象。  

C#
複製            
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.Generic.IEnumerable<int> 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 } 

示例

下面的示例演示一個做爲迭代器的 get 訪問器。  在該示例中,每一個 yield return 語句返回一個用戶定義的類的實例。  

C#
複製            
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# 語法和用法的權威資料。

相關文章
相關標籤/搜索