Share via


yield (Referencia de C#)

La palabra clave yield indica al compilador que el método en el que aparece es un bloque de iteradores. El compilador genera una clase para implementar el comportamiento que se expresa en el bloque de iteradores. En el bloque de iteradores, la palabra clave yield se usa junto con la palabra clave return para proporcionar un valor al objeto enumerador. Este es el valor que se devuelve, por ejemplo, en cada bucle de una instrucción foreach. La palabra clave yield también se usa con break para indicar el final de la iteración. Para obtener más información sobre los iteradores, vea Iteradores (Guía de programación de C#). En el ejemplo siguiente, se muestran las dos formas de la instrucción yield.

yield return <expression>;
yield break;

Comentarios

En una instrucción yield return, expression se evalúa y se devuelve como un valor al objeto enumerador; expression debe poder convertirse implícitamente al tipo yield del iterador.

En una instrucción yield break, se devuelve el control incondicionalmente al llamador del iterador, que es el método IEnumerator.MoveNext (o su homólogo System.Collections.Generic.IEnumerable<T> genérico), o bien, el método Dispose del objeto enumerador.

La instrucción yield solo puede aparecer dentro de un bloque iterator, que puede implementarse como el cuerpo de un método, operador o descriptor de acceso. El cuerpo de dicho método, operador o descriptor de acceso se controla mediante las siguientes restricciones:

  • No se permiten bloques unsafe.

  • Los parámetros del método, operador o descriptor de acceso no pueden ser ref ni out.

  • Una instrucción yield return no puede encontrarse en cualquier parte dentro de un bloque try-catch. Se puede encontrar en un bloque try si dicho bloque va seguido de un bloque finally.

  • Una instrucción yield break puede encontrarse en un bloque try o un bloque catch pero no en un bloque finally.

Una instrucción yield no puede aparecer en un método anónimo. Para obtener más información, vea Métodos anónimos (Guía de programación de C#).

Cuando se utiliza con expression, una instrucción yield return no puede aparecer en un bloque catch ni en un bloque try que tengan una o más cláusulas catch. Para obtener más información, vea Instrucciones para el control de excepciones (Referencia de C#).

Ejemplo

En el siguiente ejemplo, la instrucción yield se utiliza dentro de un bloque de iteradores, que es el método Power(int number, int power). Cuando se invoca al método Power, este devuelve un objeto enumerable que contiene las potencias de un número. Observe que el tipo de valor devuelto del método Power es System.Collections.IEnumerable, un tipo de interfaz de iteradores.

public class List
{
    //using System.Collections;
    public static IEnumerable Power(int number, int exponent)
    {
        int counter = 0;
        int result = 1;
        while (counter++ < exponent)
        {
            result = result * number;
            yield return result;
        }
    }

    static void Main()
    {
        // Display powers of 2 up to the exponent 8:
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }
}
/*
Output:
2 4 8 16 32 64 128 256 
*/

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#)

Utilizar iteradores (Guía de programación de C#)

Conceptos

Guía de programación de C#

Otros recursos

Referencia de C#