2

私が読んだことから、

yield return <value> 

行が実行された瞬間に関数から飛び出します。しかし、スコット・ガスリーのテキストは、

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");

これはどのように作動しますか?

4

3 に答える 3

6

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

于 2009-07-30T20:16:11.990 に答える
3

yieldを参照(C# リファレンス)

yield キーワードは、遅延評価と呼ばれるものを使用します。これが実際に意味することは、「yield return」に続くものは、列挙子から要求されるまで評価されないということです。

また、Eric Lippert の Iterator Blocks に関するブログもご覧ください。
第 1
部 第 2 部 - Ref または Out パラメーター
がない理由 第 3 部 - finally で譲れ
ない理由 第 4 部 - catch で譲れない理由
第 5 部 - プッシュとプルの比較
第 6 部 - 安全でないコードがない理由

于 2009-07-30T20:24:14.313 に答える
0

yield return列挙子オブジェクトに値を返し、基本的に配管コードを自動化するため機能します(つまり、構文糖衣です)。メソッドが返されることはありませんyield break

詳しくは:

于 2009-07-30T20:23:55.407 に答える