NerdDinnerサンプルのDinner.GetRuleViolations関数はどのようにリストを返しますか?

StackOverflow https://stackoverflow.com/questions/1209054

質問

読んだものから、

yield return <value> 

行が実行された瞬間に関数から飛び出します。ただし、Scott Guthrieのテキストは次のことを示しています

var errors = dinner.GetRuleViolations();

GetRuleViolationsは長いリストであるにもかかわらず、すべてのルール違反のリストを正常に引き出します

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

これはどのように機能しますか

役に立ちましたか?

解決

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

他のヒント

yield(C#リファレンス)

を参照
  

yieldキーワードは、   怠evaluationな評価。これが意味すること   実質的には以下のことです   <!> quot; yield return <!> quot;評価されません   から要求されるまで   列挙子。

イテレータブロックに関するEric Lippertのブログもご覧ください。
パート1
パート2-参照または出力パラメーターがない理由
パート3-最終的に収益が得られない理由
パート4-漁獲量が減る理由
パート5 -プッシュvsプル
パート6-安全でないコードがない理由

機能するのは、yield returnが列挙子オブジェクトに値を返し、基本的に配管コードを自動化するためです(つまり、シンタックスシュガー)。メソッドが戻ることはなく、yield breakになります。

詳細:

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top