Maison  >  Article  >  développement back-end  >  Mot-clé de rendement en C#

Mot-clé de rendement en C#

王林
王林original
2024-09-03 15:26:44297parcourir

Yield est un mot-clé contextuel en C#. Les mots-clés contextuels sont les mots-clés en C# qui ne sont pas réservés au programme complet. Il s’agit plutôt de mots-clés réservés à certaines parties du programme où le mot-clé peut être utilisé de manière pertinente. Ces mots-clés peuvent être utilisés comme identifiants valides partout où leur pertinence n'apporte aucune signification particulière au compilateur.

Le mot-clé rendement indique que la méthode ou l'accesseur contenant le mot-clé est une méthode/accesseur itérateur. Une méthode/accesseur itérateur est une méthode qui ne renvoie pas une seule valeur. Au lieu de cela, il est appelé par itérations et renvoie des valeurs différentes à chaque itération.

Syntaxe

La syntaxe du mot-clé rendement est assez simple. Il vous suffit de spécifier le mot-clé avant l'instruction return de la méthode ou de l'accesseur.

yield return <expression>;

OU

yield break;

Ce sont les deux implémentations du mot-clé. Lorsqu'il est utilisé avec une instruction return, le mot-clé rendement renvoie la valeur suivante calculée à partir de l'expression, jusqu'à ce que la condition de sortie de l'expression soit remplie. Lorsqu'il est utilisé avec le mot-clé break, le mot-clé rendement interrompt l'itération et l'exécution du programme sort de la méthode/accesseur.

Comment fonctionne le mot-clé Yield en C# ?

  1. Alors, comment fonctionne le mot-clé en C# ? Quelle est l’implémentation interne du mot-clé dans le compilateur C# ? Comprenons. La méthode contenant le mot-clé rendement peut être consommée par une boucle d'itérateur telle que une requête foreach ou LINQ. Chaque itération de la boucle appelle la méthode. Le code de la méthode est exécuté jusqu'à ce qu'une instruction Yield Return ou Yield Break soit rencontrée.
  2. La position actuelle de l'exécution dans la méthode est conservée et l'itération suivante continue là où elle s'était arrêtée lors de l'itération précédente.
  3. C'était simple, n'est-ce pas ? Passons à la mise en œuvre technique de celui-ci. La méthode contenant le mot clé rendement doit toujours renvoyer un IEnumerable ou un IEnumerator. Chaque fois que le compilateur rencontre le mot clé rendement, il sait que la méthode est consommée par un itérateur. Lorsque la méthode est appelée, le compilateur n’exécute pas le corps de la méthode comme il le fait normalement.
  4. Au lieu de cela, il exécute le corps de la méthode et renvoie un ensemble compilé de IEnumerables à la variable itérateur consommatrice. À chaque appel de la méthode, le compilateur recherche une instruction rendement et suspend l'exécution à cette instruction. L'itération suivante de la boucle continue l'exécution à partir du dernier emplacement interrompu. Cela continue jusqu'à la condition de sortie de la boucle ou une instruction de rupture de rendement. Pour stocker les informations d'état après chaque itération, le compilateur crée une machine à états.

Exemples de mots-clés de rendement en C#

Considérons quelques exemples :

Exemple n°1 – Méthode

L'exemple ci-dessous génère la série de Fibonacci à l'aide du mot-clé rendement.

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<int> 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;
}
}
}

Mot-clé de rendement en C#

Exemple n°2 – Accesseur

L'exemple suivant utilise le mot-clé rendement avec un accesseur 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<int> 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<Day> 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; }
}
}

Mot-clé de rendement en C#

Exemple n°3 – rupture de rendement

L'exemple suivant démontre l'utilisation de l'instruction Yield Break. L'itération se termine dès qu'un numéro dans la série est trouvé ou que la limite maximale de recherche est atteinte.

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<int> 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;
}
}
}

Mot-clé de rendement en C#

Si nous modifions elementToFind 1234, le résultat sera –

Mot-clé de rendement en C#

Règles

1) Chaque élément doit être renvoyé un par un à l'aide de l'instruction Yield Return.
2) Le type de retour doit être un IEnumerable ou un IEnumerator.
3) Vous ne pouvez pas l'utiliser dans, ref ou out des mots-clés avec rendement.
4) Le mot-clé Yield ne peut pas être utilisé avec des expressions Lambda ou des méthodes anonymes.
5) Une instruction rendement-retour ne peut pas se trouver dans un bloc try-catch. Il peut être à l'intérieur d'un bloc try-finally.
6) Une instruction Yield Break ne peut pas se trouver à l’intérieur d’un bloc try-finally. Il peut être à l'intérieur d'un bloc try-catch.

Avantages

Le mot-clé rendement évite d'avoir à créer des collections temporaires. Vous n'avez pas besoin de créer des collections temporaires pour stocker les données avant qu'elles ne soient renvoyées par la méthode. De plus, l'état d'exécution de la méthode est conservé et n'a donc pas besoin d'être explicitement stocké dans le code.

Conclusion – Mot clé de rendement en C#

Nous avons appris de cet article que comment générer un mot-clé est un mot-clé très utile en C#. Il permet de coder des problèmes complexes avec le moins de lignes possible et rend également le code facile à comprendre. Il s'agissait d'un article de niveau avancé sur le parcours C#. Il est recommandé d'essayer d'utiliser le mot-clé dans votre code afin d'avoir une pratique pratique.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Expression Lambda C#Article suivant:Expression Lambda C#