rendimento (referência de C#)
O yield palavra-chave sinaliza ao compilador que o método em que aparece é um bloco iterador. O compilador gera uma classe para implementar o comportamento é expresso no bloco iterador. No bloco iterador, o yield palavra-chave é usada junto com o return palavra-chave para fornecer um valor para o objeto enumerador. Esse é o valor retornado, por exemplo, em cada loop de um foreach instrução. O yield palavra-chave também é usado com break para sinalizar o final da iteração. Para obter mais informações sobre os iteradores, consulte Iterators (C# Programming Guide). O exemplo a seguir mostra as duas formas da instrução yield.
yield return <expression>;
yield break;
Comentários
Em um rendimento retornar instrução, expression é avaliado e retornado como um valor para o objeto enumerador; expressiondeve ser implicitamente conversível para o tipo de yield do iterador.
Em um yield break instrução, o controle incondicionalmente é retornado ao chamador do iterador, que é o IEnumerator.MoveNext método (ou seu genérica System.Collections.Generic.IEnumerable<T> contraparte) ou o Dispose o método do objeto enumerador.
O yield instrução só pode aparecer dentro de um iterator block, que pode ser implementado como o corpo de método, operador ou o acessador. O corpo de tais métodos, operadores ou acessadores é controlado pelas seguintes restrições:
Blocos não seguros não são permitidos.
Parâmetros para o método, operador ou assessor não podem ser ref ou check-out.
Uma instrução yield return não pode ser localizada em qualquer lugar dentro de um bloco try-catch. Pode ser localizado em um bloco try se o bloco try é seguido por um bloco finally.
Uma instrução yield break pode estar localizada em um bloco catch ou de um bloco try, mas não um bloco finally.
A yield a instrução não pode aparecer em um método anônimo. Para obter mais informações, consulte Anonymous Methods (C# Programming Guide).
Quando usado com expression, um yield return a instrução não pode aparecer em um catch bloco ou em um try bloco que possui um ou mais catch cláusulas. Para obter mais informações, consulte Exception Handling Statements (C# Reference).
Exemplo
No exemplo a seguir, o yield declaração é usada dentro de um bloco iterador, que é o método Power(int number, int power). Quando o Power método é invocado, ele retorna um objeto enumerável, que contém os poderes de um número. Observe que o tipo de retorno da Power método é System.Collections.IEnumerable, um tipo de interface de iterador.
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
*/
Especificação da linguagem C#
Para obter mais informações, consulte C# Language Specification A especificação de linguagem é a fonte definitiva para a sintaxe e o uso de C#.
Consulte também
Referência
Usando iteradores (guia de programação de C#)