Compartir a través de


yield (Referencia de C#)

Cuando se utiliza la palabra clave de yield en una instrucción, indica que el método, el operador, o el descriptor de get en el que aparece es un iterador.Utiliza un iterador para realizar una iteración personalizada en una colección.El ejemplo siguiente se muestran los dos formas de la instrucción de yield.

yield return <expression>;
yield break;

Comentarios

Utilice una instrucción de yield return para devolver cada elemento de uno en uno.

Se utiliza un método de iterador mediante una instrucción foreach o consulta LINQ.Cada iteración del bucle de foreach llama al método de iterador.Cuando una instrucción de yield return se consigue en el método de iterador, se devuelve expression, y la ubicación actual en el código se conserva.La ejecución se reinicia desde esa ubicación la próxima vez que la función de iterador se denomina.

Puede utilizar una instrucción de yield break para finalizar la iteración.

Para obtener más información sobre los iteradores, vea Iteradores (C# y Visual Basic).

Los métodos de iterador y los descriptores de acceso

La declaración de un iterador debe cumplir los requisitos siguientes:

Una conversión implícita debe existir del tipo de expresión en la instrucción de yield return al tipo de valor devuelto del iterador.

No puede incluir una instrucción de yield return o de yield break en los métodos que tienen las siguientes características:

Control de excepciones

Una instrucción de yield return no puede encontrarse en un bloque de la intento- captura.Una instrucción de yield return puede encontrarse en el bloque try de una instrucción try - final.

Una instrucción de yield break puede encontrarse en un bloque try o una captura bloqueada pero no un bloque finally.

Si el cuerpo de foreach (fuera del método de iterador) produce una excepción, un bloque de finally en el método de iterador se ejecuta.

Implementación técnica

El código siguiente devuelve IEnumerable<string> de un método de iterador a continuación recorre en iteración sus elementos.

IEnumerable<string> elements = MyIteratorMethod();
foreach (string element in elements)
{
   …
}

La llamada a MyIteratorMethod no se ejecuta el cuerpo del método.En su lugar la llamada devuelve IEnumerable<string> en la variable de elements.

En una iteración del bucle de foreach, el método de MoveNext se llama para elements.Esta llamada se ejecuta el cuerpo de MyIteratorMethod hasta que se alcanza la siguiente instrucción de yield return.La expresión devuelta por la instrucción de yield return determina no solo el valor de la variable de element para el consumo del cuerpo del bucle pero también la propiedad de Current de elementos, que es IEnumerable<string>.

En cada iteración del bucle de foreach, la ejecución del cuerpo de iterador continúa de donde se quedó, de nuevo deteniéndose cuando llega a una instrucción de yield return.El bucle de foreach completa cuando finaliza el método de iterador o una instrucción de yield break se alcance.

Ejemplo

El ejemplo siguiente tiene una instrucción de yield return que está dentro de un bucle de for.Cada iteración del cuerpo de instrucción de foreach en Process crea una llamada a la función de iterador de Power.Cada llamada a la función de iterador continúa a la ejecución siguiente de la instrucción de yield return, que durante la siguiente iteración del bucle de for.

El tipo de valor devuelto del método de iterador es IEnumerable, que es un tipo de interfaz del iterador.Cuando se llama al método de iterador, devuelve un objeto enumerable que contiene los potencias de un número.

public class PowersOf2
{
    static void Main()
    {
        // Display powers of 2 up to the exponent of 8:
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }

    public static System.Collections.IEnumerable Power(int number, int exponent)
    {
        int result = 1;

        for (int i = 0; i < exponent; i++)
        {
            result = result * number;
            yield return result;
        }
    }

    // Output: 2 4 8 16 32 64 128 256
}

El ejemplo siguiente se muestra un descriptor de acceso de get que sea un iterador.En el ejemplo, las instrucciones de yield return devuelve una instancia de una clase definida por el usuario.

public static class GalaxyClass
{
    public static void ShowGalaxies()
    {
        var theGalaxies = new Galaxies();
        foreach (Galaxy theGalaxy in theGalaxies.NextGalaxy)
        {
            Debug.WriteLine(theGalaxy.Name + " " + theGalaxy.MegaLightYears.ToString());
        }
    }

    public class Galaxies
    {

        public System.Collections.Generic.IEnumerable<Galaxy> NextGalaxy
        {
            get
            {
                yield return new Galaxy { Name = "Tadpole", MegaLightYears = 400 };
                yield return new Galaxy { Name = "Pinwheel", MegaLightYears = 25 };
                yield return new Galaxy { Name = "Milky Way", MegaLightYears = 0 };
                yield return new Galaxy { Name = "Andromeda", MegaLightYears = 3 };
            }
        }

    }

    public class Galaxy
    {
        public String Name { get; set; }
        public int MegaLightYears { get; set; }
    }
}

Especificación del lenguaje C#

Para obtener más información, vea la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.

Vea también

Referencia

foreach, in (Referencia de C#)

Conceptos

Guía de programación de C#

Otros recursos

Referencia de C#

Iteradores (C# y Visual Basic)