2012年12月30日 星期日

一秒看破 yield

其實這個東西老早在 N 年前 就看過高人的 CODE 裡面有出現 當年調查了一下

除了大喊yoooooooo~ 之外 根本不知道他在公啥小 果斷裝傻 沒關係長大以後就會懂了

什麼時候長大呢? 現在就長大了

我們先看看 MSDN怎麼說

MSDN表示:yield 關鍵字,表示它所在的方法、運算子或 get 存取子是 Iterator。 您使用 Iterator 對集合中的自訂反覆項目。

Iterator 是啥小? Google翻譯表示:迭代器

迭代器 是啥小? Wiki表示:迭代器(iterator)有時又稱游標(cursor)是程式設計的軟體設計模式,可在容器物件(container,例如鏈表或陣列)上遍訪的介面,設計人員無需關心容器物件的內容。

總算還是有人講地球話

簡單來說 就是整天在用的 foreach (傳回型別必須是 IEnumerable、 IEnumerable<T>、 IEnumerator或 IEnumerator<T>。)

其實 MSDN 這篇的範例還算滿好懂的

http://msdn.microsoft.com/zh-tw/library/9k7k7cf0.aspx

應用層面上 有時候我們需要 從一個集合中篩選小集合 或者 從查詢中篩選結果 或者 從條件判斷中篩選true條件

以往都這麼做 new 個 List<T> 然後 add add add~

而使用 yield 的話 則可以省省這個 List<T>

yoooooooo~ 太神奇了蘿絲



另一個比較實用的地方是 可以使用在 get 存取子

有時候我們 常常會有一些 固定不變的像是常數的數據組

以往都這麼做 一堆的列舉 一堆的陣列 一堆的產生List<T>物件的方法 姑且不論這個寫法好不好 光是有人惡搞的話 你就會發現整個專案 布滿無數重複的該方法

換成 yield 並把 Members 變成一個類別的唯讀屬性

要取得 Members 都只能透過特定的類別的屬性

沒有留言:

張貼留言