Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 26370|Répondre: 0

[Source] C# Utilisation des mots-clés yield

[Copié le lien]
Publié sur 29/05/2019 09:55:11 | | | |
1. Fonctions implémentées par yield

rendement :

Examinons le code suivant, qui implémente une fonction similaire à parcourir un tableau avec foreach via yield return, indiquant que yield return est également utilisé pour implémenter la fonction de l’itérateur.

Coupure de rendement :

En regardant le code ci-dessous, seuls 1 et 2 sont produits, mais pas 3, ce qui indique que l’itérateur a été arrêté par la rupture de cédement, donc la rupture de cédent est utilisée pour terminer l’itération.

2. Il ne peut être utilisé que dans <T><T>des méthodes, opérateurs, accès qui doivent retourner un IEnumerable, IEnumerable, IEnumerator ou IEnumerator.

3. Le principe de mise en œuvre du mot-clé yield

Nous avons remplacé la boucle foreach par une boucle while et constaté que, bien que nous n’ayons pas implémenté GetEnumerator(), ni les propriétés MoveNext() et Current correspondantes d’IEnumerator, nous avons tout de même travaillé avec ces fonctions.

Quant à la raison de cela, nous pouvons utiliser ILSpy pour décompiler l’exe généré afin d’en trouver la raison.

Puisque la décompilation directe en C# deviendra ce qu’elle est



Nous avons donc choisi de le décompiler en code IL avec des annotations C#, bien que la lisibilité soit faible, mais nous pouvons comprendre les principes en détail.
Commençons par examiner la traduction du programme, une nouvelle classe est automatiquement générée lors de la compilation.



Examinons de plus près le code, et EnumerableFuc() renvoie cette nouvelle classe.



En regardant l’implémentation de la classe générée automatiquement par ce code, on peut voir qu’elle hérite IEnumerable<T>, IEnumerable, IEnumerator ou IEnumerator, et on <T>devrait pouvoir deviner que cette nouvelle classe est la raison pour laquelle nous n’implémentons pas les propriétés MoveNext() et Current correspondantes de l’IEnumerator, mais on peut toujours utiliser ces fonctions normalement.



Voyons comment cette classe s’itère ; regardons principalement la fonction MoveNext()





Chaque appel à la fonction MoveNext() ajoute 1 à l’état, et un total de 4 itérations sont effectuées, les trois premières retournant true et la dernière retournant false, ce qui signifie la fin de l’itération. Ces quatre itérations correspondent aux instructions dans enumberableFuc() qui sont divisées en 4 parties par 3 instructions yield.

Le véritable processus d’itération avec enumberableFuc() est :

1. Exécuter la fonction enumberableFuc() pour obtenir une instance de la classe générée automatiquement par le code.
2. Appelez ensuite la fonction GetEnumberator() pour commencer à itérer sur la classe acquise elle-même en tant qu’itérateur.
3. Chaque fois que vous exécutez MoveNext(), l’état augmente de 1, et l’instruction switch vous permet d’exécuter différentes parties du code à chaque fois que vous appelez MoveNext().
4。 MoveNext() renvoie faux, fin.
Cela montre également que le mot-clé yield est en réalité un sucre syntaxique, et qu’il s’agit finalement d’une fonction itérative implémentée par la mise en œuvre <T>des interfaces IEnumberable, IEnumberable, <T>IEnumberator et IEnumberator.





Précédent:. Stratégie de réessai de Polly pour la résilience et la gestion des pannes transitoires .NET
Prochain:HttpResult obtient un set-cookie au lieu d’un cookie
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com