1.yield return 語(yǔ)句,,由于yield return 并不對(duì)應(yīng)多余的il指令,。所以編譯器就會(huì)在編譯的時(shí)候,生成一個(gè)實(shí)現(xiàn)Ienumator接口的類.并且自動(dòng)維護(hù)該類的狀態(tài).比如movenext, 2.
使用yield return 很容易實(shí)現(xiàn)遞歸調(diào)用中的迭代器. 如果以上的問(wèn)題,不使用yield
return的話,可想而知.要么你先把所有的結(jié)果暫時(shí)放到一個(gè)對(duì)象集合中. 可是這樣就以為著在迭代之前一定要計(jì)算號(hào). 要么可能你的movenext
就相當(dāng)?shù)膹?fù)雜了. .NET 編譯生成的代碼其實(shí)利用了state machine. 代碼量也很大. 類似迭代的調(diào)用,比如二叉樹(shù)遍歷 用yield return 就很方便了.另外還有常說(shuō)的pipeline模式也很方便了. 可是yield return 還是有一些缺陷. 比如如果GetFiles 有一個(gè)參數(shù)是ref 或者 out, 那這個(gè)state machine就很難去維護(hù)狀態(tài)了. 事實(shí)上,yield return那是不支持方法帶有ref或者out參數(shù)的情況.
在迭代器塊中用于向枚舉數(shù)對(duì)象提供值或發(fā)出迭代結(jié)束信號(hào)。它的形式為下列之一:
yield return <expression>; yield break;
備注
計(jì)算表達(dá)式并以枚舉數(shù)對(duì)象值的形式返回,;expression 必須可以隱式轉(zhuǎn)換為迭代器的 yield 類型,。
yield 語(yǔ)句只能出現(xiàn)在 iterator 塊中,,該塊可用作方法,、運(yùn)算符或訪問(wèn)器的體。這類方法,、運(yùn)算符或訪問(wèn)器的體受以下約束的控制:
yield 語(yǔ)句不能出現(xiàn)在匿名方法中,。有關(guān)更多信息,請(qǐng)參見(jiàn) 匿名方法(C# 編程指南),。
當(dāng)和 expression 一起使用時(shí),,yield return 語(yǔ)句不能出現(xiàn)在 catch 塊中或含有一個(gè)或多個(gè) catch 子句的 try 塊中。有關(guān)更多信息,,請(qǐng)參見(jiàn) 異常處理語(yǔ)句(C# 參考),。
示例
在下面的示例中,迭代器塊(這里是方法 Power(int number, int power))中使用了 yield 語(yǔ)句,。當(dāng)調(diào)用 Power 方法時(shí),,它返回一個(gè)包含數(shù)字冪的可枚舉對(duì)象。注意 Power 方法的返回類型是 IEnumerable(一種迭代器接口類型),。
using System; using System.Collections.Generic; using System.Collections; using System.Text;
namespace yieldList { 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);
} Console.ReadKey(); } } /* Output: 2 4 8 16 32 64 128 256 */
}
|