Introdução à palavra-chave Rendimento em C #

Rendimento é uma palavra-chave contextual em C #. Palavras-chave contextuais são aquelas em C # que não são reservadas para o programa completo. Em vez disso, são palavras-chave reservadas para certas partes do programa em que a palavra-chave pode ser usada de forma relevante. Essas palavras-chave podem ser usadas como identificadores válidos sempre que sua relevância não transmitir nenhum significado especial ao compilador.

A palavra-chave yield indica que o método ou o acessador que contém a palavra-chave é um método / acessador de iterador. Um método / acessador de iterador é aquele que não retorna um único valor. Em vez disso, é chamado em iterações e retorna valores diferentes em cada iteração.

Sintaxe

A sintaxe da palavra-chave yield é bastante simples. Você só precisa especificar a palavra-chave antes da declaração de retorno do método ou do acessador.

yield return ;

OU

yield break;

Estas são as duas implementações da palavra-chave. Quando usada com uma instrução de retorno, a palavra-chave yield retorna o próximo valor calculado a partir da expressão, até que a condição de saída da expressão seja atendida. Quando usada com a palavra-chave break, a palavra-chave yield interrompe a iteração e a execução do programa sai do método / acessador.

Como a palavra-chave Rendimento funciona em C #?

  1. Então, como a palavra-chave em C #? Qual é a implementação interna da palavra-chave no compilador C #? Vamos entender. O método que contém a palavra-chave yield pode ser consumido por um loop do iterador, como foreach ou consulta LINQ. Cada iteração do loop faz uma chamada para o método O código no método é executado até que seja encontrada uma declaração de retorno ou quebra de rendimento.
  2. A posição atual da execução no método é mantida e a próxima iteração continua de onde parou na iteração anterior.
  3. Isso foi simples, não foi? Vamos entrar na implementação técnica do mesmo. O método que contém a palavra-chave yield deve sempre retornar um IEnumerable ou IEnumerator. Sempre que o compilador encontra a palavra-chave yield, ele sabe que o método é consumido por um iterador. Quando o método é chamado, o compilador não executa o corpo do método normalmente.
  4. Em vez disso, ele executa o corpo do método e retorna um conjunto compilado de IEnumerables para a variável iteradora consumidora. Em todas as chamadas do método, o compilador procura por uma declaração de rendimento e pausa a execução nessa declaração. A próxima iteração do loop continua a execução a partir do último local em pausa. Isso continua até a condição de saída do loop ou uma declaração de quebra de rendimento. Para armazenar as informações de estado após cada iteração, o compilador cria uma máquina de estado.

Exemplos de palavra-chave Rendimento em C #

Vamos considerar alguns exemplos:

Exemplo # 1 - Método

O exemplo abaixo gera a série Fibonacci usando a palavra-chave yield.

using System;
using System.Collections.Generic;
public class Program
(
public static void Main()
(
foreach (int ele in GetFibonacciSeries(10))
(
Console.Write(ele + "\t");
)
)
public static IEnumerable GetFibonacciSeries(int x)
(
for (int a = 0, b = 0, c = 1; a < x; a++)
(
yield return b;
int temp = b + c;
b = c;
c = temp;
)
)
)

Exemplo # 2 - Acessador

O exemplo a seguir usa a palavra-chave yield com um acessador get.

using System;
using System.Collections.Generic;
public class Program
(
public static void Main()
(
foreach (Day day in new Days().DaysOfWeek)
(
Console.WriteLine("Day (0) of the week is (1)", day.DayOfWeek, day.DayName);
)
)
public static IEnumerable Show(int x)
(
for (int a = 0, b = 0, c = 1; a < x; a++)
(
yield return b;
int temp = b + c;
b = c;
c = temp;
)
)
public class Days
(
public IEnumerable DaysOfWeek
(
get
(
yield return new Day(DayName = "Sunday", DayOfWeek = 1);
yield return new Day(DayName = "Monday", DayOfWeek = 2);
yield return new Day(DayName = "Tuesday", DayOfWeek = 3);
yield return new Day(DayName = "Wednesday", DayOfWeek = 4);
yield return new Day(DayName = "Thursday", DayOfWeek = 5);
yield return new Day(DayName = "Friday", DayOfWeek = 6);
yield return new Day(DayName = "Saturday", DayOfWeek = 7);
)
)
)
public class Day
(
public string DayName
( get; set; )
public int DayOfWeek
( get; set; )
)
)

Exemplo # 3 - quebra de rendimento

O exemplo a seguir demonstra o uso da declaração de quebra de rendimento. A iteração é encerrada assim que um número da série é encontrado ou o limite máximo de pesquisa é atingido.

using System;
using System.Collections.Generic;
public class Program
(
public static void Main()
(
int elementToFind = 21;
int maxElements = 100;
foreach (int ele in FindFibonacciNumber(elementToFind, maxElements))
(
Console.Write("Found the number " + elementToFind + " in Fibonacci series.");
)
)
public static IEnumerable FindFibonacciNumber(int n, int max)
(
for (int a = 0, b = 0, c = 1; true; a++)
(
if (a > max)
(
Console.Write("Searched first " + max + " Fibonacci numbers. Element " + n + " not found");
yield break;
)
if (b == n)
(
yield return b;
yield break;
)
int temp = b + c;
b = c;
c = temp;
)
)
)

Se mudarmos elementToFind 1234, a saída será -

Regras

1) Cada elemento deve ser retornado um de cada vez usando a declaração de retorno de rendimento.
2) O tipo de retorno deve ser um IEnumerable ou IEnumerator.
3) Você não pode usar palavras-chave dentro, ref ou out com rendimento.
4) A palavra-chave Yield não pode ser usada com expressões lambda ou métodos anônimos.
5) Uma declaração de retorno de rendimento não pode estar dentro de um bloco try-catch. Pode estar dentro de um bloco de tentativa e finalmente.
6) Uma declaração de quebra de rendimento não pode estar dentro de um bloco try-finally. Pode estar dentro de um bloco try-catch.

Vantagens

A palavra-chave yield poupa a necessidade de criar coleções temporárias. Você não precisa criar coleções temporárias para armazenar os dados antes que eles retornem do método. Além disso, o estado de execução do método é mantido e, portanto, não precisa ser explicitamente armazenado no código.

Conclusão - Palavra-chave Rendimento em C #

Aprendemos neste artigo que como gerar palavras-chave é uma palavra-chave muito útil em C #. Ajuda a codificar problemas complexos com o menor número possível de linhas e também facilita a compreensão do código. Este foi um artigo de nível avançado na jornada de C #. Recomenda-se tentar usar a palavra-chave no seu código para que você tenha uma prática prática.

Artigos recomendados

Este é um guia para a palavra-chave Rendimento em C #. Aqui discutimos como gerar trabalhos de palavras-chave em C # com exemplos, vantagens e regras. Você também pode consultar o seguinte artigo para saber mais -

  1. Substituindo em C #
  2. Namespaces em C #
  3. Ponteiros em c #
  4. Destruidor em c #
  5. Palavras-chave PHP
  6. Iterador em Java
  7. Trabalho e os 3 principais métodos enum em C #
  8. Série Fibonacci em JavaScript com exemplos
  9. Guia completo para destruidor em PHP