4.1 迭代器塊
一個迭代器塊(iterator block)是一個能夠產生有序的值序列的塊。迭代器塊和普通語句塊的區別就是其中出現的一個或多個yield語句。
yield return語句產生迭代的下一個值。
yield break語句表示迭代完成。
只要相應的函數成員的返回值類型是一個枚舉器接口或是一個可枚舉接口,一個迭代器塊就可以用作方法體、運算符體或訪問器體。
迭代器塊並不是C#語法中的獨立元素。它們受多種因素的制約,並且對函數成員聲明的語義有很大影響,但在語法上它們只是塊(block)。
當一個函數成員用一個迭代器塊來實現時,如果函數成員的形式參數列表指定了ref或out參數,則會引起編譯錯誤。
如果在迭代器塊中出現了return語句,則會因此編譯錯誤(但yield return語句是允許的)。
如果迭代器塊包含不安全上下文,則會引起編譯錯誤。一個迭代器塊必須定義在一個安全的上下文中,即使它的聲明嵌套在一個不安全上下文中。
在下面的示例中,迭代器塊(這裡是方法 Power(int number, int power))中使用了 yield 語句。
當調用 Power 方法時,它返回一個包含數字冪的可枚舉對象。注意 Power 方法的返回類型是 IEnumerable(一種迭代器接口類型)。
using System; using System.Collections; public class List { 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); } } } 2 4 8 16 32 64 128 256