Desarrollo en .NET

Desarrollo en C# bajo la plataforma .NET y Mono

C# a fondo: La instrucción yield

La instrucción yield se emplea en un bloque iterador. Un bloque iterador es una sección de código que devuelve una secuencia de valores del mismo tipo.

La instrucción yield se emplea con la instrucción return para proporcionar un valor al objeto enumerador y con la instrucción break para indicar el final de la iteración.

Veamos un ejemplo sencillo que nos aclare el concepto y nos muestre las ventajas de su uso. El siguiente método devuelve la lista de números pares comprendidos entre dos números:

public static IEnumerable<int> ObtenerPares(int inicio, int fin)
{
    List<int> pares = new List<int>();

    for (int i = inicio; i <= fin; i++)
        if ((i % 2) == 0)
            pares.Add(i);

    return pares;
}

La instrucción yield nos da la oportunidad de llevar a cabo este tipo de operaciones sin tener que declarar una variable en la que ir almacenando los distintos valores antes de proceder a su devolución como resultado:

public static IEnumerable<int> ObtenerPares(int inicio, int fin)
{
    for (int i = inicio; i <= fin; i++)
        if ((i % 2) == 0)
            yield return i;
}

Referencia:

yield (Referencia de C#)

Iteradores (Guía de programación de C#)

Posted: 12/4/2012 9:27 por Darío Cerredelo | con 4 comment(s)
Archivado en:
Comparte este post:

Comentarios

Ernesto ha opinado:

Muy interesante, pero lamentablemente no se puede colocar dentro de una seccion protegida por un try..catch, vere si por ahi encuentro alguna zona de codigo donde se pueda usar esto.

# April 12, 2012 7:05 PM

Darío Cerredelo ha opinado:

Tienes razón, sólo puede encontrarse en un bloque try seguido de un bloque finally.

# April 12, 2012 7:29 PM

Eduard Tomàs i Avellana ha opinado:

Eric Lippert explicó en su dia la razón de esa decisión en su blog:blogs.msdn.com/.../iterator-blocks-part-five-push-vs-pull.aspx

Saludos!!! ;-)

# April 13, 2012 8:57 AM

Darío Cerredelo ha opinado:

Gracias por la aportación. ;)

# April 13, 2012 10:00 AM