Je me rends compte que c'est une vieille question (avant Jon Skeet?) Mais j'ai considéré cette question moi-même juste récemment. Malheureusement, les réponses actuelles (à mon avis) ne mentionnent pas l'avantage le plus évident de la déclaration de rendement. Le plus grand avantage de l'instruction yield est qu'elle vous permet d'effectuer des itérations sur de très grandes listes avec une utilisation de la mémoire beaucoup plus efficace, en utilisant par exemple une liste standard. Par exemple, supposons que vous ayez une requête de base de données qui renvoie 1 million de lignes. Par exemple, disons que vous avez une requête de base de données qui renvoie 1 million de lignes. Vous pouvez récupérer toutes les lignes à l'aide d'un DataReader et les stocker dans une liste, ce qui nécessite par conséquent list_size * row_size octets de mémoire. Vous pouvez également utiliser l'instruction yield pour créer un Iterator et stocker uniquement une seule ligne en mémoire à la fois. En effet, cela vous donne la possibilité de fournir une capacité de "streaming" sur de grands ensembles de données.
De plus, dans le code qui utilise l'Iterator, vous utilisez une simple boucle foreach et pouvez décider de sortir de la boucle si nécessaire.Si vous vous cassez tôt, vous n'avez pas forcé la récupération de l'ensemble des données lorsque vous avez seulement besoin des 5 premières lignes (par exemple).
En ce qui concerne:
Ideally some problem that cannot be solved some other way
L'instruction yield ne vous donne pas tout ce que vous ne pouviez pas faire en utilisant votre propre implémentation de iterator personnalisée, mais il vous sauve besoin d'écrire le code souvent complexe nécessaire. Il y a très peu de problèmes (le cas échéant) qui ne peuvent pas résoudre plus d'une manière.
Voici quelques questions et réponses plus récentes qui fournissent plus de détails:
Yield keyword value added?
Is yield useful outside of LINQ?