c# - resueltos - para que sirven los limites matematicos
¿De qué sirve el límite de rendimiento? (6)
Posible duplicado:
¿Qué significa "ceder el rendimiento" en "C #"?
¿Alguien puede ver un uso para la declaración de "ruptura de rendimientos" que de otro modo no podría haberse logrado mediante el uso de "romper" o "devolver".
Esta afirmación parece ser completamente inútil. Además, sin esta afirmación, la declaración de "retorno de rendimiento X" podría haberse simplificado a "rendimiento X", que es mucho más legible.
¿Qué me estoy perdiendo?
Debe distinguir entre devolver una implementación de IEnumerable que ya existe (tal vez va a devolver una Lista) y un iterador anónimo.
No puede usar el retorno o el corte porque son palabras clave válidas que pueden usarse para otros fines. Tampoco puede usar el rendimiento por su cuenta porque necesita tener una forma de especificar si está devolviendo un artículo en la enumeración o terminando la enumeración, por lo tanto, la necesidad de rendimiento de retorno y rotura de rendimiento.
Es ilegal usar una instrucción return
en un bloque iterador. Además, la instrucción break
podría tener un doble propósito dentro de un bloque iterador si se le permitiera afectar la iteración: podría usarse para salir de un bucle o fuera de un interruptor, y podría usarse para salir de un iterador. toda la iteración.
yield return
y yield break
y son dos palabras clave en sí mismas, y ambas parecen ser necesarias.
Para dar un ejemplo de código, digamos que desea escribir un iterador que no devuelve nada si la fuente es nula o está vacía.
public IEnumerable<T> EnumerateThroughNull<T>(IEnumerable<T> source)
{
if (source == null)
yield break;
foreach (T item in source)
yield return item;
}
Sin la ruptura de rendimiento, se vuelve imposible devolver un conjunto vacío dentro de un iterador.
ceder y romper el rendimiento hacen cosas completamente diferentes! Mira
for(int i = 0; i < 10; ++i) {
if(i > 5) { break; }
yield return i;
}
for(int v = 2710; v < 2714; v+=2) {
yield return v;
}
for(int s = 16; s < 147; ++s) {
if(s == 27) { yield break; }
else if(s > 17) { yield return s; }
}
La salida sería un IEnumerable de estos valores: 0, 1, 2, 3, 4, 5, 2710, 2712, 18, 19, 20, 21, 22, 23, 24, 25, 26
Aquí hay algún método que no hace nada útil, pero ilustra que puede combinar el salto de rendimiento y el rompimiento en el mismo método, ¡y hacen dos cosas diferentes! La ruptura simplemente se rompe, el salto de rendimiento termina el método por completo.
Supongo que el motivo por el que no se utiliza la devolución es porque no estás devolviendo un IEnumerable en el método. Además, ¿no crees que la ruptura de rendimiento es más clara que el rendimiento, para este tipo de situación iterativa? Yo personalmente.
yield break especifica que el método debe dejar de devolver resultados. "return" por sí solo no sería lo suficientemente bueno, o podría incluso llevar a un error, porque el tipo de devolución del método debe ser IEnumerable.
No estoy seguro de por qué la palabra clave return también es necesaria. Mi mejor opción sería que ayuda a aclarar un poco la intención de la declaración.
Si estás interesado, este artículo explica qué rendimiento está haciendo detrás de las escenas
return
statement se utiliza para devolver un valor de una función.
Si tiene una función de iterador como esta:
public IEnumerable<int> IteratorOverInt() { }
una declaración de devolución en la función anterior tendría que devolver un IEnumerable<int>
lleno IEnumerable<int>
.
public IEnumerable<int> IteratorOverInt() {
return new List<int> { 1, 2, 3, 4 };
}
pero si está trabajando en una función de iterador, usará yield return
para que su código se vea así:
public IEnumerable<int> IteratorOverInt() {
for (int i = 0; i < 4; i++) {
yield return i;
}
}
Entonces, el yield return
un int
mientras que la firma del método exige IEnumerable<int>
¿Qué haría una declaración de return
en el caso anterior? ¿Los resultados de devolución anulan los rendimientos? Concatenando lo que sea con los rendimientos? return
no tiene mucho sentido en el caso anterior.
Por lo tanto, necesitamos una forma de return
que tenga sentido en un bloque iterador, que es la razón por la cual hay un yield break
.
Por supuesto, puedes hacerlo con un break
, pero ¿cómo salir del cuerpo de la función si tienes más código que ejecutar? ¿Envolver todo en un complicado bloque if-else? Yo diría que solo tener yield break
sería mejor.