É algo já não tão novo, apareceu no C# 2.0, e só existe no C#, não existe no VB.
O yield serve para gerar um Enumerable on demand. Por exemplo, se você quiser
criar uma coleção de inteiros rapidamente, como faz? Veja abaixo, com yield:
public static IEnumerable<int> GetNums(int from, int to)
{
for (int i = from; i <= to; i++)
yield return i;
}
Legal, né? Para usar é fácil, verificamos com um teste:
[TestMethod()]
public void GetNumsTest()
{
var nums = Class1.GetNums(2, 5);
Assert.AreEqual(4, nums.Count());
Assert.IsTrue(nums.Contains(2));
Assert.IsTrue(nums.Contains(3));
Assert.IsTrue(nums.Contains(4));
Assert.IsTrue(nums.Contains(5));
}
Gosto bastante também do exemplo
do MSDN:
public static IEnumerable<int> Power(int number, int exponent)
{
int counter = 0;
int result = 1;
while (counter++ < exponent)
{
result = result * number;
yield return result;
}
}
Mais uma vez, para testar:
[TestMethod]
public void PowerTest()
{
var nums = Class1.Power(2, 5);
Assert.AreEqual(5, nums.Count());
Assert.IsTrue(nums.Contains(2));
Assert.IsTrue(nums.Contains(4));
Assert.IsTrue(nums.Contains(8));
Assert.IsTrue(nums.Contains(16));
Assert.IsTrue(nums.Contains(32));
}
Mas o yield não é para ser usado somente com inteiros, você pode usá-lo para
retornar um IEnumerable de qualquer coisa. Aqui um exemplo com strings:
public static IEnumerable<string> GetWordsUpper(string phrase)
{
foreach (var word in phrase.Split(' '))
{
yield return word.ToUpper();
}
}
Para testar é fácil:
[TestMethod]
public void GetWordsUppderTest()
{
var palavras = Class1.GetWordsUpper("ola como vai?");
Assert.AreEqual(3, palavras.Count());
Assert.IsTrue(palavras.Contains("OLA"));
Assert.IsTrue(palavras.Contains("COMO"));
Assert.IsTrue(palavras.Contains("VAI?"));
}
Você pode levar isso longe, como obtenção de dados do banco, obtenção de input
do usuário, tudo somente quando precisar, e por aí vai.
E você, já usou o yield? Gosta? Onde? Comente aqui.