2009-07-30 9 views
2

NerdDinnerのDinner.GetRuleViolations関数はどのようにリストを返しますか?私が読んだから

yield return <value> 

は、関数の外に行が実行された瞬間にジャンプします。しかし、スコット・ガスリーのテキストはGetRuleViolationsは、この作業を行いどのよう

if(String.someFunction(text)) 
    yield return new RuleViolation("Scary message"); 
if(String.anotherFunction(text)) 
    yield return new RuleViolation("Another scary message"); 

の長いリストがあるにもかかわらず

var errors = dinner.GetRuleViolations(); 

が正常にすべてのルール違反のリストを引き出すことを示していますか?

答えて

6

リストを返しません。 IEnumerable<RuleViolation>を返します。 yield returnは、iterator methodの値を返します。イテレータは、メソッド内で一連の要素を生成する簡単な方法です。

0

yield returnは基本的に(すなわち、それは糖衣構文です)あなたのためのいくつかの配管のコードを自動化する、列挙子オブジェクトに値を返すので、それは動作します。それはyield breakだろうと、メソッドが返すことはありません。

詳細情報:

3

yieldキーワードは 遅延評価として知られているもの使用していますyield (C# reference)

を参照してください。これは事実上 を意味することは、それが 列挙子から要求されるまで何も 以下「降伏リターン」は を評価されないということです。

また、Iterator BlocksのEric Lippertのブログをご覧ください。
Part 1
Part 2 - Why No Ref or Out Parameters
Part 3 - Why No yield in finally
Part 4 - Why No yield in catch
Part 5 - Push vs Pull
Part 6 - Why no unsafe code

関連する問題