Yield Return: que es y como usarlo

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.

resutlado de la ejecución de yield return
Resultado de la ejecución de yield return

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.

Gracias por leerme. Últimamente le estoy dedicando mucho tiempo a generar contenido para Youtube y Twich. Te invito a que te pases por los canales y me sigas 🙂

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *