Je me répète lorsque je dis que c’est dans les outils que l’on utilise le plus souvent que l’on ignore le plus les secrets.
Le langage de programmation C# est l’un de mes outils de prédilection. Pour être clair, c’est le langage que j’utilise à tous les jours dans le cadre de mon travail.
Chaque langage a ses spécificités, ses avantages et limitations. En bout de compte, ils nous donnent les moyens de réaliser ce que nous avons à construire.
yield
Jusqu’à récemment, j’avais associé le mot clé yield à Java. Avec Java, le mot clé yield permet de notifier le système que le thread en cours peut être libéré de son exécution pour laisser l’occasion au CPU d’aller exécuter d’autre processus.
Le contexte d’utilisation du mot clé est uniquement réservé au contexte du Threading. Donc, ses utilisations sont très spécifiques et relativement limitées.
Il s’avère qu’avec .NET, le mot clé yield est associé aux collections et non pas au threading. Ceci étant dit, il n’est pas évident d’en deviner son utilisation à moins de lire la définition de celui-ci dans MSDN.
The yield keyword, indicates that the method, operator, or get accessor in which it appears is an iterator. You use an iterator to perform a custom iteration over a collection. The following example shows the two forms of the yield statement.
yield return <expression>;
yield break;
En autre termes, yield permet indique que vous pourrez itérer sur ce que vous retournerez au moment où vous l’utiliserez.
Pratiquement parlant, son utilisation et surtout reliée au cas où vous désirez extraire d’une collection un certain nombre de sous éléments. Par exemple, filtrer une liste d’utilisateurs par leur âge et procéder à un traitement spécifique pour un certain regroupement.
Utilisation
Utiliser yield implique très peu de choses à la structure de son code. Il faut toutefois changer l’approche avec laquelle on utilise ses collections.
Le meilleur exemple est assez visuel. Il est possible de procéder au calcul de la suite de Fibonacci de façon assez élégante de cette façon.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public IEnumerable<int> Fibonacci(int x) | |
{ | |
int prev = –1; | |
int next = 1; | |
for (int i = 0; i < x; i++) | |
{ | |
int sum = prev + next; | |
prev = next; | |
next = sum; | |
yield return sum; | |
} | |
} |
L’élégance vient du fait que cette fonction peut être utilisée dans une boucle ForEach comme ceci :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
foreach (var x in YieldTest.Fibonacci(10)) | |
{ | |
System.Console.WriteLine(x); | |
} |
Avec yield, il n’est pas question de réécrire fanatiquement ses fonctions manipulant des collections en tenant compte que le mot clé est à notre disposition. Bien au contraire!
Toutefois, je crois qu’il est important de savoir comment fonctionne le Framework lorsqu’il est temps de manipuler des listes d’éléments. D’ailleurs, est-ce qu’il est nécessaire de mentionner que LINQ utilise déjà cette approche?
Ressources supplémentaires
Cette démystification du keyword yield est très intéressante !
Merci !