チュートリアル (Professional ASP.NET MVC - Nerd Dinner) に取り組んでいると、次のコード スニペットに出会いました。
public IEnumerable<RuleViolation> GetRuleViolations() {
if (String.IsNullOrEmpty(Title))
yield return new RuleViolation("Title required", "Title");
if (String.IsNullOrEmpty(Description))
yield return new RuleViolation("Description required","Description");
if (String.IsNullOrEmpty(HostedBy))
yield return new RuleViolation("HostedBy required", "HostedBy");
if (String.IsNullOrEmpty(Address))
yield return new RuleViolation("Address required", "Address");
if (String.IsNullOrEmpty(Country))
yield return new RuleViolation("Country required", "Country");
if (String.IsNullOrEmpty(ContactPhone))
yield return new RuleViolation("Phone# required", "ContactPhone");
if (!PhoneValidator.IsValidNumber(ContactPhone, Country))
yield return new RuleViolation("Phone# does not match country", "ContactPhone");
yield break;
}
を読みましたがyield
、私の理解はまだ少しぼんやりしていると思います。それがしているように見えるのは、絶対に必要な場合を除き、実際に循環を行うことなく、コレクション内のアイテムを循環できるオブジェクトを作成することです。
ただし、この例は私には少し奇妙です。私が考えていることはRuleViolation
、プログラマーがコレクション内の特定の項目を実際に要求するか、for each
または のような LINQ 拡張メソッドを使用するまで、インスタンスの作成を遅らせること.ElementAt(2)
です。
ただし、これ以外にもいくつか質問があります。
if
ステートメントの条件部分はいつ評価されますか? いつGetRuleViolations()
呼び出されるか、または列挙型が実際に反復されるのはいつですか? 言い換えれば、私が呼び出してから実際にそれを反復しようとするまでの間に から の値が変化した場合、作成さTitle
れるかどうか?null
Really Geeky Dinner
GetRuleViolations()
RuleViolation("Title required", "Title")
なぜ
yield break;
必要なのですか?ここで実際に何をしているのですか?Title
null または空であるとしましょう。呼び出しGetRuleViolations()
てから、結果の列挙型を 2 回続けて反復すると、何回new RuleViolation("Title required", "Title")
呼び出されますか?