Hoy os quiero traer una pequeña píldora con el uso de yield return en C#. Usándolo, estamos indicando que el método es un iterador. Pero, ¿esto que quiere decir?
Veámoslo con un ejemplo, leed el siguiente código. Sin conocer el uso de yield return, a priori el método DameInts() sería imposible, ya que entraríamos en un bucle infinito. Tomate un segundo y ejecútalo, a ver que pasa.
using System;
using System.Collections.Generic;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var resultado = DameInts();
foreach (var a in resultado)
Console.WriteLine(a);
}
public static IEnumerable<int> DameInts()
{
int i = 0;
while (true)
{
yield return ++i;
System.Threading.Thread.Sleep(1000);
}
}
}
}
Analizando el comportamiento de Yield Return
¿ya has lanzado el programa? ¿te ha sorprendido el comportamiento? Básicamente esta haciendo una especie de «stream» y ejecuta el método en cada iteración.
Con esto, si te fijas, conseguimos que la memoria se mantenga estable y no suba, ya que no tenemos que almacenar todo el resultado del método DameInts() en memoria. Si modificáramos el método y le pusiéramos por ejemplo un for con un millón de elementos, tendríamos que esperar a que se procesara todo el método y tendríamos que meter en memoria todo el resultado del método.
He querido poner un ejemplo para explicar el funcionamiento de una caracteristica que en según que escenarios puede ser muy útil.
Más información en la página de referencia de Microsoft.