Me doy cuenta de que esta es una pregunta antigua (¿antes de Jon Skeet?) Pero últimamente he estado considerando esta pregunta. Desafortunadamente, las respuestas actuales aquí (en mi opinión) no mencionan la ventaja más obvia de la declaración de rendimiento.
El mayor beneficio de la declaración de rendimiento es que le permite iterar en listas muy grandes con un uso de memoria mucho más eficiente que utilizando, por ejemplo, una lista estándar.
Por ejemplo, supongamos que tiene una consulta de base de datos que devuelve 1 millón de filas. Puede recuperar todas las filas utilizando un DataReader y almacenarlas en una lista, por lo que requiere list_size * row_size bytes de memoria.
O puede utilizar la declaración de rendimiento para crear un iterador y solo almacenar una fila en la memoria a la vez. En efecto, esto le da la capacidad de proporcionar una capacidad de "transmisión" sobre grandes conjuntos de datos.
Además, en el código que usa el iterador, utiliza un bucle foreach simple y puede decidir salir del bucle según sea necesario.Si se rompe temprano, no ha forzado la recuperación de todo el conjunto de datos cuando solo necesitaba las primeras 5 filas (por ejemplo).
Con respecto a:
Ideally some problem that cannot be solved some other way
comunicado El rendimiento no le da nada que no podía hacer uso de su propia implementación personalizada iterador, pero le ahorra necesidad de escribir el código a menudo compleja sea necesario. Hay muy pocos problemas (si los hay) que no se pueden resolver de más de una manera.
Aquí hay un par de preguntas y respuestas más recientes que proporcionan más detalles:
Yield keyword value added?
Is yield useful outside of LINQ?