Работа с помощью обучающей программы (Professional ASP.NET MVC - Nerd ужин), я наткнулся на этот фрагмент кода:Интересное использование C# выход ключевого слова в 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
является пустым или пустым. Если я вызываюGetRuleViolations()
, то итерация по результирующему перечислимому два раза подряд, сколько раз будет вызыватьсяnew RuleViolation("Title required", "Title")
?
. Компилятор .Net превращает этот синтаксический сахар в более ухоженную форму. Скомпилируйте образец, а затем загрузите IL в отражатель. Вы должны понимать, что там происходит. –