(C#) Yield Return and Iterator Pattern

本篇同步發佈在 Medium 平台上 Medium 連結

What is Yield?

Yield 就是 Microsoft .Net 中用來實作 iterator(迭代器) 設計模式的語法糖,透過編譯器幫你轉成較複雜的 Code。

舉個例子 🌰

從 DB 取出使用者設定的信件排程資訊,每封信件的 Template 可能不同,最後送給寄信服務發送。將如何設計此系統的運作流程呢?

一般作法:

將全部資料都儲存在 List物件中,最終再 return 到寄信服務,這將可能造成系統吃掉大量的記憶體,甚至發生 System.OutOfMemoryException 的錯誤!

還沒完全載入 Mail 資訊記憶體就已經攀升至 2G 啦 💥

使用 Yield 作法:

一樣的情境,只是將 mailList.Add(new Mail()) 改為 yield return new Mail(),執行順序將有明顯的變化,如下圖將會依序執行(1) → (2) → (3) → (4) → (2) → (3) → (4) ……,記憶體的使用也相對平穩許多。

若有興趣也可以參考 Andrew 的部落格,裡頭清楚的說明編譯器是如何幫你產生繁雜的 IEnumerator 實作方式讓你隨隨便便就可以跟別人宣稱:看! 我的程式有用到 Iterator 這個設計模式喔 XD 🐂🐂🐂

Reference

[C#: yield return] #1. How It Work ?

【C#】Yield Return 與迭代器

comments powered by Disqus