2010-04-23 5 views
22

J'ai une vague compréhension du mot-clé yield dans , mais je n'ai pas encore vu le besoin de l'utiliser dans mon code. Cela vient probablement d'un manque de compréhension de celui-ci. Donc, quelles sont les bonnes utilisations typiques de yield?Utilisation du rendement en C#

+3

Essayez cette première: http://stackoverflow.com/search?q= rendement + c% 23, la première page de résultats a au moins 5 questions qui devraient vous aider. – Benjol

+0

Oh, merci! Beaucoup de choses utiles là-bas! – Steve

+0

duplicata possible de http://stackoverflow.com/questions/39476/what-is-the-yield-keyword-used-in-c –

Répondre

14

yield rend très simple la mise en œuvre d'un énumérateur. Donc, si vous voulez écrire une méthode qui retourne un IEnumerable<T> cela vous évite d'avoir à créer la classe de l'énumérateur - vous avez juste un résultat à la fois et le compilateur s'occupe des détails sous les couvertures.

Un cas pratique consiste à écrire un «énumérateur infini» que l'appelant peut appeler autant de fois qu'il le faut. Voici un exemple qui génère une série infinie de nombres Fibonacci: http://chrisfulstow.com/fibonacci-numbers-iterator-with-csharp-yield-statements/ (bien ... théoriquement infini, mais en pratique limitée à la taille de UInt64).

4

Le rendement implémente le modèle de chargement paresseux. Je suggère de considérer son utilité dans cette perspective.

Par exemple. Dans le contexte des logiciels d'entreprise sur lesquels je travaille, cela pourrait présenter l'avantage de réduire la charge sur la base de données. Vous écrivez du code qui extrait une variété de données de la base de données, mais seule cette partie sera chargée, ce qui est vraiment nécessaire pour un scénario particulier. Si un utilisateur ne va pas plus loin dans l'interface utilisateur, les données respectives ne seront pas chargées.

+0

C'était un exemple vraiment utile qui démontre que vous avez une longue liste qui pourrait ne pas être utilisée complètement. – maulik13

4

Le rendement est utilisé dans les enquêteurs. Le compilateur C# suspend automatiquement l'exécution de votre boucle d'énumération et renvoie la valeur actuelle à l'appelant.

IEnumerable<int> GetIntegers(int max) { 
    for(int i = 1; i <= max) { 
     yield return i; // Return current value to the caller 
    } 
} 

- ou (plus maladroits) -

IEnumerable<int> GetIntegers(int max) { 
    int count = 0; 
    while(true) { 
     if(count >= max) yield break; // Terminate enumeration 

     count++; 
     yield return count; // Return current value to the caller 
    } 
} 

Plus de détails sur MSDN.

3

également très bon dans les tests et se moquant quand vous voulez juste tester un IEnumerable <> rapidement, quelque chose comme ...

yield return somevalue; 
yield return someothervalue; 
yield return yetanotherone; 
Questions connexes