Работа через учебник (профессиональный 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")
?/p > -
Почему требуется
yield break;
? Что это действительно делает здесь? -
Скажем,
Title
является нулевым или пустым. Если я вызываюGetRuleViolations()
, то перебираем результирующее перечислимое два раза подряд, сколько раз будет вызыватьсяnew RuleViolation("Title required", "Title")
?