O operador Yield (C#)

Written by Bruno Pires on Outubro 14th, 2009

O operador Yield decerto não dos mais utilizados no C#, no entanto pode em muitas situações simplificar o código produzido. Não é o operador de mais fácil compreensão que a linguagem C# disponibiliza ao programadores, no entanto é um operador extremamente útil em algumas situações.

Ele é utilizado num método para ajudar este a retornar uma instância do tipo IEnumerable ou IEnumerator.

Não pode ser utilizado num método anónimo, não pode também ser utilizado num bloco catch ou num bloco try que tenha mais do que uma cláusula catch.

 

Exemplo Prático com a utilização do operador yield :

using System;
using System.Collections;

namespace TesteYield
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (int numero in Exemplo1(5))
            {
                Console.WriteLine(numero);
            }
        }

        public static IEnumerable Exemplo1(int numero)
        {
            for (int i = 0; i < numero; i++)
            {
                yield return i;
            }

            yield break;
        }
    }
}

 

Exemplo Prático com a recorrendo a uma estrutura de dados:

using System;
using System.Collections;
using System.Collections.Generic;

namespace TesteYield
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (int numero in Exemplo1(5))
            {
                Console.WriteLine(numero);
            }
        }

        public static IEnumerable Exemplo1(int numero)
        {
            var res = new List<int>();

            for (int i = 0; i < numero; i++)
            {
                res.Add(i);
            }

            return res;
        }
    }
}

O resultado do programa será:

exemplo1

Quando é utilizado o yield return, não provoca o fim da execução do método, no caso do exemplo 1, o ciclo “for” vai incrementar a variável “i” e guardar o valor na variável do tipo IEnumerable ou IEnumerator.

Exemplo Prático nº2 – como criar facilmente um IEnumerable ou IEnumerator recorrendo ou yield:

using System;
using System.Collections;
using System.Collections.Generic;

namespace TesteYield
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (int numero in Exemplo2())
            {
                Console.WriteLine(numero);
            }
        }

        public static IEnumerable<int> Exemplo2()
        {
            yield return 0;
            yield return 1;
            yield return 2;
            yield return 3;
            yield return 4;

            yield break;
        }
    }
}

 

O resultado do programa será:

exemplo1

 

Leave a Comment