Introducción a la palabra clave de rendimiento en C #

El rendimiento es una palabra clave contextual en C #. Las palabras clave contextuales son aquellas palabras clave en C # que no están reservadas para el programa completo. Más bien son palabras clave reservadas para ciertas partes del programa donde la palabra clave se puede usar de manera relevante. Estas palabras clave se pueden usar como identificadores válidos siempre que su relevancia no transmita ningún significado especial para el compilador.

La palabra clave de rendimiento indica que el método o el descriptor de acceso que contiene la palabra clave es un método iterador / descriptor de acceso. Un método iterador / descriptor de acceso es aquel que no devuelve un solo valor. Más bien, se llama en iteraciones y devuelve diferentes valores en cada iteración.

Sintaxis

La sintaxis de la palabra clave de rendimiento es bastante simple. Simplemente necesita especificar la palabra clave antes de la declaración de devolución del método o el descriptor de acceso.

yield return ;

O

yield break;

Estas son las dos implementaciones de la palabra clave. Cuando se usa con una declaración return, la palabra clave yield devuelve el siguiente valor calculado a partir de la expresión, hasta que se cumpla la condición de salida de la expresión. Cuando se usa con la palabra clave break, la palabra clave yield rompe la iteración y la ejecución del programa sale del método / descriptor de acceso.

¿Cómo funciona Yield Keyword en C #?

  1. Entonces, ¿cómo funciona la palabra clave en C #? ¿Cuál es la implementación interna de la palabra clave en el compilador de C #? Vamos a entender El método que contiene la palabra clave de rendimiento puede ser consumido por un bucle iterador como foreach o consulta LINQ. Cada iteración del bucle realiza una llamada al método. El código en el método se ejecuta hasta que se encuentra una declaración de rendimiento o ruptura de rendimiento.
  2. La posición actual de la ejecución en el método se conserva y la siguiente iteración continúa desde donde se dejó en la iteración anterior.
  3. Esto fue simple, ¿no? Entremos en la implementación técnica de la misma. El método que contiene la palabra clave de rendimiento siempre debe devolver un IEnumerable o IEnumerator. Cada vez que el compilador encuentra la palabra clave de rendimiento, sabe que un iterador consume el método. Cuando se llama al método, el compilador no ejecuta el cuerpo del método como lo hace normalmente.
  4. En su lugar, ejecuta el cuerpo del método y devuelve un conjunto compilado de IEnumerables a la variable iteradora consumidora. En cada llamada del método, el compilador busca una declaración de rendimiento y detiene la ejecución en esa declaración. La siguiente iteración del bucle continúa la ejecución desde la última ubicación en pausa. Esto continúa hasta la condición de salida del bucle o una declaración de ruptura de rendimiento. Para almacenar la información de estado después de cada iteración, el compilador crea una máquina de estados.

Ejemplos de palabras clave de rendimiento en C #

Dejanos considerar algunos ejemplos:

Ejemplo # 1 - Método

El siguiente ejemplo genera la serie de Fibonacci utilizando la palabra clave de rendimiento.

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;
)
)
)

Ejemplo # 2 - Accesor

El siguiente ejemplo utiliza la palabra clave de rendimiento con un descriptor de acceso 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; )
)
)

Ejemplo # 3 - ruptura de rendimiento

El siguiente ejemplo demuestra el uso de la declaración de ruptura de rendimiento. La iteración finaliza en cuanto se encuentra un número en la serie o se alcanza el límite máximo de búsqueda.

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;
)
)
)

Si cambiamos elementToFind 1234, la salida será:

Reglas

1) Cada elemento debe devolverse uno a la vez utilizando la declaración de rendimiento.
2) El tipo de retorno debe ser IEnumerable o IEnumerator.
3) No puede usarlo para ingresar, ref o eliminar palabras clave con rendimiento.
4) La palabra clave Yield no se puede usar con expresiones Lambda o métodos anónimos.
5) Una declaración de rendimiento no puede estar dentro de un bloque try-catch. Puede estar dentro de un bloque try-finally.
6) Una declaración de ruptura de rendimiento no puede estar dentro de un bloque try-finally. Puede estar dentro de un bloque try-catch.

Ventajas

La palabra clave de rendimiento evita la necesidad de crear colecciones temporales. No necesita crear colecciones temporales para almacenar los datos antes de que sean devueltos por el método. Además, el estado de ejecución del método se conserva y, por lo tanto, no necesita almacenarse explícitamente en el código.

Conclusión: rendimiento de palabra clave en C #

Aprendimos de este artículo que cómo generar palabras clave es una palabra clave muy útil en C #. Ayuda a codificar problemas complejos con la menor cantidad de líneas posible y también hace que el código sea fácil de entender. Este fue un artículo de nivel avanzado sobre el viaje de C #. Se recomienda probar y usar la palabra clave en su código para que pueda practicar un poco.

Artículos recomendados

Esta es una guía de rendimiento de palabras clave en C #. Aquí discutimos cómo producir palabras clave funciona en C # con ejemplos, ventajas y reglas. También puede consultar el siguiente artículo para obtener más información:

  1. Anulación en C #
  2. Espacios de nombres en C #
  3. Punteros en C #
  4. Destructor en C #
  5. Palabras clave PHP
  6. Iterator en Java
  7. Métodos de trabajo y Top 3 Enum en C #
  8. Serie Fibonacci en JavaScript con ejemplos
  9. Guía completa de Destructor en PHP