C#的yield關鍵字通過教程工作的(專業ASP.NET MVC書呆子晚餐),我碰到這個代碼片段來yield
,但我想我的理解還是有點朦朧。看起來要做的是創建一個對象,允許循環通過集合中的項目,而實際上並不需要做循環,除非和直到絕對必要。有趣的使用書呆子晚餐教程
雖然這個例子對我來說有點奇怪。我認爲它的做法是延遲創建任何RuleViolation
實例,直到程序員實際使用for each
或LINQ擴展方法(如.ElementAt(2)
)請求集合中的特定項目。
除此之外,雖然,我有一些問題:
什麼時候該
if
語句的條件部分得到評估?當調用GetRuleViolations()
時,或者當枚舉實際上迭代?換句話說,如果Title
的值從null
更改爲Really Geeky Dinner
到我呼叫GetRuleViolations()
的時間與我嘗試實際迭代它的時間之間,是否會創建RuleViolation("Title required", "Title")
?爲什麼需要
yield break;
?這裏真的在做什麼?比方說
Title
爲空或空白。如果我打電話給GetRuleViolations()
,然後遍歷所產生的枚舉兩次,將調用new RuleViolation("Title required", "Title")
多少次?
.Net編譯器將這種語法糖變成更混雜的形式。編譯樣本,然後在反射器中加載IL。你應該正確地理解那裏到底發生了什麼。 – 2009-12-28 19:22:14