1. 程式人生 > 實用技巧 >C# 中yield關鍵字的使用

C# 中yield關鍵字的使用

  含有yield的函式說明它是一個生成器,而不是普通的函式。當程式執行到yield這一行時,該函式會返回值,並儲存當前域的所有變數狀態;等到該函式下一次被呼叫時,會從上一次中斷的地方開始執行,一直遇到下一個yield, 程式返回值, 並在此儲存當前狀態; 如此反覆,直到函式正常執行完成。
  .net裡面的迭代器模式 yield return。
  迭代器模式是設計模式中行為模式(behavioral pattern)的一個例子,他是一種簡化物件間通訊的模式,也是一種非常容易理解和使用的模式。簡單來說,迭代器模式使得你能夠獲取到序列中的所有元素而不用關心是其型別是array,list,linked list或者是其他什麼序列結構。這一點使得能夠非常高效的構建資料處理通道(data pipeline)--即資料能夠進入處理通道,進行一系列的變換,或者過濾,然後得到結果。事實上,這正是LINQ的核心模式。

  在.NET中,迭代器模式被IEnumerator和IEnumerable及其對應的泛型介面所封裝。如果一個類實現了IEnumerable接 口,那麼就能夠被迭代;呼叫GetEnumerator方法將返回IEnumerator介面的實現,它就是迭代器本身。迭代器類似資料庫中的遊標,他是資料序列中的一個位置記錄。迭代器只能向前移動,同一資料序列中可以有多個迭代器同時對資料進行操作。

  程式碼除錯檢視

 1  public class YieldTest
 2     {
 3         public IEnumerable<int> CreateEnumerable()
4 { 5 try 6 { 7 Console.WriteLine("{0} CreateEnumerable()方法開始", DateTime.Now); 8 for (int i = 0; i < 5; i++) 9 { 10 Console.WriteLine("{0}開始 yield {1}", DateTime.Now, i); 11 yield
return i; 12 Console.WriteLine("{0}yield 結束", DateTime.Now); 13 if (i == 4) 14 { 15 yield break;//直接終結迭代 4會出現的,, 16 } 17 } 18 Console.WriteLine("{0} Yielding最後一個值", DateTime.Now); 19 yield return -1; 20 Console.WriteLine("{0} CreateEnumerable()方法結束", DateTime.Now); 21 } 22 finally 23 { 24 Console.WriteLine("停止迭代!"); 25 } 26 } 27 28 /// <summary> 29 /// MoveNext 檢查是否存在 並設定current 30 /// </summary> 31 public void Show() 32 { 33 IEnumerable<int> iterable = this.CreateEnumerable();//1 不會直接執行 34 //IEnumerator iterator = iterable.GetEnumerator(); 35 IEnumerator<int> iterator = iterable.GetEnumerator(); 36 Console.WriteLine("開始迭代"); 37 while (true) 38 { 39 Console.WriteLine("呼叫MoveNext方法……"); 40 Boolean result = iterator.MoveNext();//2 正式開啟CreateEnumerable 41 Console.WriteLine("MoveNext方法返回的{0}", result); 42 if (!result) 43 { 44 break; 45 } 46 Console.WriteLine("獲取當前值……"); 47 Console.WriteLine("獲取到的當前值為{0}", iterator.Current); 48 } 49 } 50 }
1   class Program
2     {
3         static void Main(string[] args)
4         {
5             YieldTest yieldTest= new YieldTest ();
6             yieldTest.Show();
7             Console.Read();
8         }
9     }

執行結果: