¿Cuándo debo usar el rendimiento de devolución y cuándo debo usar solo devolución?¿Cuándo usar el rendimiento?
Respuesta
La construcción yield
se utiliza para crear un iterador que puede producir múltiples valores en la serie:
IEnumerable<int> three_numbers() {
yield return 1;
yield return 2;
yield return 3;
}
...
foreach (var i in three_numbers()) {
// i becomes 1, 2 and 3, in turn.
}
El rendimiento es para iteradores.
Le permite procesar una lista en pequeñas golondrinas, lo cual es bueno para listas grandes.
Lo mágico de Yield es que recuerda dónde estás entre invocaciones.
Si no está iterando, no necesita Rendimiento.
Use yield cuando devuelve un enumerable, y no tiene todos los resultados en ese momento.
Prácticamente, he utilizado el rendimiento cuando quiero iterar a través de un gran bloque de información (base de datos, archivo plano, etc.), y no quiero cargar todo en la memoria primero. El rendimiento es una buena forma de iterar a través del bloque sin cargar todo a la vez.
Rendimiento La devolución continuará el método desde ese punto. Por ejemplo, desea recorrer una matriz o lista y devolver cada elemento a la vez para que la persona que llama procese. Entonces usará retorno de rendimiento. Si desea devolver todo y luego hecho, usted no necesita hacer eso
Se explica aquí :
C# Language Reference
yield (C# Reference)
el método llamado devolverá todos los valores individuales para que puedan ser enumerados por la persona que llama.
Esto significa que necesitará usar rendimiento cuando desee que todos los resultados posibles devueltos por una iteración.
La palabra clave yield
es increíblemente poderosa. Básicamente, le permite devolver rápidamente los objetos IEnumerable
y IEnumerator
sin codificarlos explícitamente.
Considere un escenario en el que desea devolver la intersección de dos objetos IEnumerable. Aquí es cómo lo haría usando la palabra clave yield.
public static class Program
{
public static void Main()
{
IEnumerable<object> lhs = new List<int> { 1, 2, 3, 4, 5 };
IEnumerable<object> rhs = new List<int> { 3, 4, 5, 6, 7 };
foreach (object item in IntersectExample.Intersect(lhs, rhs))
{
Console.WriteLine(item);
break;
}
}
}
public static class IntersectExample
{
public static IEnumerable<object> Intersect(IEnumerable<object> lhs, IEnumerable<object> rhs)
{
var hashset = new HashSet<object>();
foreach (object item in lhs)
{
if (!hashset.Contains(item))
{
hashset.Add(item);
}
}
foreach (object item in rhs)
{
if (hashset.Contains(item))
{
yield return item;
}
}
}
}
Es difícil de apreciar hasta que no se dé cuenta de lo que está pasando. Normalmente, cuando se cruzan dos conjuntos, se completa la operación completa antes de devolver el resultado a la persona que llama. Significa que la complejidad del tiempo de ejecución de la operación es O(m + n)
, donde m
y n
son los tamaños de las colecciones que se cruzan, independientemente de lo que haga con el resultado posterior. Pero, en mi ejemplo, solo quería elegir el primer elemento del resultado. El uso de un IEnumerable
que fue creado por la palabra clave yield
hace que sea muy fácil retrasar parte del procesamiento hasta que realmente se requiera. Mi ejemplo se ejecuta en O(m)
. La alternativa es codificar el IEnumerable
y mantener el estado en él manualmente. El poder de la palabra clave yield
es que crea esa máquina de estado para usted.
- 1. ¿Cuándo usar el cierre?
- 2. Cuándo usar OSGi EventAdmin y cuándo no?
- 3. Cuándo usar Class.isInstance() y cuándo usar el operador instanceof?
- 4. Cuándo deberíamos usar mutex y cuándo deberíamos usar el semáforo
- 5. Cuándo usar el sistema() y cuándo usar execv *()?
- 6. Cuándo usar Ruby vs Cuándo usar PHP
- 7. Cuándo usar undef_method, y cuándo usar remove_method?
- 8. Cuándo usar Pepino y cuándo usar RSpec?
- 9. cuándo usar Tarea y cuándo usar Subproceso?
- 10. Cuándo usar categorías y cuándo usar subclases?
- 11. Cuándo usar el modificador estático en PHP
- 12. ¿Cuándo se necesita realmente 'Rendimiento'?
- 13. Cuándo usar el signo CSS +
- 14. ¿Cuándo usar == y cuándo usarlo?
- 15. Java: ¿cuándo usar Iterators?
- 16. ¿Cuándo deberíamos usar Radix sort?
- 17. ¿Cuándo debería usar doctrine ORM y cuándo zend-db-table?
- 18. Sincronización, ¿Cuándo o no usar?
- 19. Cuándo usar el método GetXXX() y cuándo una propiedad Getter
- 20. Configuración de MySQL: cuándo usar el guión y cuándo usar el guión bajo
- 21. Cuándo usar un módulo y cuándo usar una clase
- 22. Cuándo usar componentes y cuándo usar extensiones en Yii?
- 23. Cuándo usar interfaces o clases abstractas? Cuándo usar ambos?
- 24. Cuándo usar vectores y cuándo usar matrices en C++?
- 25. ¿Cuándo debe usar JCR y cuándo debe usar JPA/RDBMS?
- 26. Cuándo usar atributos vs. cuándo usar propiedades en python?
- 27. ¿Cuándo debería usar require() y cuándo usar define()?
- 28. Cuándo usar dup, y cuándo usar clon en Ruby?
- 29. C#: ¿Cuándo debería usar TryParse?
- 30. Cuándo usar `zipmap` y cuándo` map vector`?