2010-04-23 15 views
22

Tengo una vaga comprensión de la palabra clave yield en , pero aún no he visto la necesidad de utilizarla en mi código. Esto probablemente proviene de una falta de comprensión de eso.Uso del rendimiento en C#

¿Cuáles son algunos buenos usos típicos de yield?

+3

probar este primero: http://stackoverflow.com/search?q= yield + c% 23, la primera página de resultados tiene al menos 5 preguntas que deberían ayudarte. – Benjol

+0

¡Oh, gracias! ¡Muchas cosas útiles allí! – Steve

+0

posible duplicado de http://stackoverflow.com/questions/39476/what-is-the-yield-keyword-used-for-in-c –

Respuesta

14

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

Un caso útil es escribir un "enumerador infinito" que la persona que llama puede 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 ... teóricamente infinito, pero en la práctica limitado al tamaño de UInt64).

4

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

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

+0

Ese fue un ejemplo realmente útil que demuestra que tiene una larga lista que podría no utilizarse por completo. – maulik13

4

El rendimiento se utiliza en los enumeradores. El compilador de C# pausa automáticamente la ejecución de su ciclo 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 sobre MSDN.

3

también bastante bueno en las pruebas y burlona cuando lo que desea es probar un IEnumerable <> rápidamente, algo así como ...

yield return somevalue; 
yield return someothervalue; 
yield return yetanotherone; 
Cuestiones relacionadas