É 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.
Nenhum comentário:
Postar um comentário