unity c# yield-return

unity - Usando el rendimiento en C#



yield return c# stack overflow (4)

Tengo una comprensión vaga de la palabra clave de yield en c# , pero todavía no he visto la necesidad de usarla en mi código. Esto probablemente viene de una falta de comprensión de ello.

Entonces, ¿cuáles son algunos buenos usos típicos del yield ?


El rendimiento implementa el patrón de carga perezosa. Sugiero considerar su utilidad desde esta perspectiva.

Por ejemplo. en el contexto del software empresarial en el que estoy trabajando, podría traer la ventaja de reducir la carga en la base de datos. Usted escribe un código que extrae una variedad de datos de la base de datos, pero solo se cargará la porción que realmente se necesita para un escenario en particular. Si un usuario no profundiza en la interfaz de usuario, los datos correspondientes no se cargarán.


El rendimiento se utiliza en los enumeradores. El compilador de C # detiene automáticamente la ejecución de su bucle de enumeración y devuelve el valor actual a la persona que llama.

IEnumerable<int> GetIntegers(int max) { for(int i = 1; i <= max) { yield return i; // Return current value to the caller } }

- o (más torpe) -

IEnumerable<int> GetIntegers(int max) { int count = 0; while(true) { if(count >= max) yield break; // Terminate enumeration count++; yield return count; // Return current value to the caller } }

Más detalles en MSDN .


También es bastante bueno en pruebas y burlas cuando solo quieres probar un IEnumerable <> rápidamente, algo como ...

yield return somevalue; yield return someothervalue; yield return yetanotherone;


yield simplemente hace que sea muy sencillo implementar un enumerador. Por lo tanto, si desea escribir un método que devuelva un IEnumerable<T> le ahorrará tener que crear la clase de enumerador; solo obtendrá un resultado a la vez y el compilador se encargará de los detalles debajo de las cubiertas.

Un caso práctico es escribir un "enumerador infinito" al que la persona que llama pueda llamar tantas veces como sea necesario. Aquí hay un ejemplo que genera una serie infinita de números de Fibonacci: http://chrisfulstow.com/fibonacci-numbers-iterator-with-csharp-yield-statements/ (bueno ... en teoría infinito, pero en la práctica limitado al tamaño de UInt64).