16 de set. de 2009

yield?

Lendo alguns artigos me perguntei o que viria a ser o tal do "yield"?

Descobri que se trata de um operador: http://msdn2.microsoft.com/en-us/library/9k7k7cf0.aspx

Pouco usado, ele retorna uma coleção (IEnumerable).

Para clarear vejamos um exemplo onde quiséssemos retornar os numeros pares de um array de inteiros... primeiramente com um algoritmo simples:

public IEnumerable ListarPares(int[] numeros)
{
    List<int> resultado = new List<int>();

    foreach (int numero in numeros)
    {
        if (numero % 2 == 0)
            resultado.Add(numero);
    }

    return resultado;
}

Para tal precisamos criar um List de inteiros para retornar o resultado após a filtragem.

já usando o yield não precisamos declarar o retorno... assim:

public IEnumerable ListarPares(int[] numeros)
{
    foreach (int numero in numeros)
    {
        if (numero % 2 == 0)
            yield return numero;
    }
}

…sendo assim, não precisamos armazenar em lugar algum... digamos que foi retornando "dinâmicamente" o resultado.

Ele acaba acumulando um "stream" de dados… podemos fazer algo assim também:

public IEnumerable ListarNomes()
{
    yield return "Eduardo";
    yield return "Spaki";
    yield return "Spoky";
}

Mas o yield tem restrições, tais como: não pode ser usando em blocos inseguros (unsafe blocks), parâmetros para o método (param) e nem usado com ref ou out.

Fonte: http://www.magodigital.info/post/2008/02/Operador-Yield-do-C.aspx

0 comentários: