Trabajando a través de un tutorial (Profesional ASP.NET MVC - Cena Nerd), me encontré con este fragmento de código:uso interesante de la palabra clave de rendimiento en C# empollón Cena tutorial
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;
}
He leído en yield
, pero creo que mi comprensión todavía es un poco confusa. Lo que parece que hacer es crear un objeto que permite bicicleta a través de los elementos de una colección sin tener que hacer la bicicleta a menos que y hasta que sea absolutamente necesario.
Este ejemplo es un poco extraño para mí, sin embargo. Lo que creo que está haciendo es retrasar la creación de cualquier instancia RuleViolation
hasta que el programador realmente solicite un elemento específico en la colección usando for each
o un método de extensión LINQ como .ElementAt(2)
.
Más allá de esto, sin embargo, tengo algunas preguntas:
¿Cuándo las partes condicionales de las declaraciones
if
se evalúan? ¿Cuándo se llamaGetRuleViolations()
o cuando el enumerable realmente se itera? En otras palabras, si el valor deTitle
cambia denull
aReally Geeky Dinner
entre el momento en que llamo alGetRuleViolations()
y el momento en que intento iterar sobre él, ¿se crearáRuleViolation("Title required", "Title")
o no?¿Por qué es necesario
yield break;
? ¿Qué está haciendo realmente aquí?Digamos
Title
es nulo o vacío. Si llamo alGetRuleViolations()
y luego repito el número enumerable resultante dos veces seguidas, ¿cuántas veces se llamará anew RuleViolation("Title required", "Title")
?
El compilador .Net convierte este azúcar sintáctico en una forma más bastarda. Compile la muestra y luego cargue IL en el reflector. Debería poder entender exactamente qué está pasando allí. –