(C#) Yield Return and Iterator Pattern

Jerry Wu
Dec 28, 2020

--

What is Yield?

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

舉個例子🌰

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

一般作法:

將全部資料都儲存在List<Mail>物件中,最終再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與迭代器

謝謝你的閱讀!如果有任何回饋或疑問,歡迎留言給我!
如果對我的文章有興趣,請不吝按下Follow & Clap!
每個月都會認真更新文章唷😊 千萬別錯過了~

--

--

Jerry Wu

Full-Stack Engineer,熱愛接觸Web前後端、DevOps相關技術與知識,喜歡分享、旅遊和桌球🏓