1033 votes

Quel est le mot-clé yield utilisé pour en c# ?

Dans la Comment puis-je Exposer qu'un Fragment de IList<> question l'une des réponses a l'extrait de code suivant:

IEnumerable<object> FilteredList()
{
    foreach( object item in FullList )
    {
        if( IsItemInPartialList( item )
            yield return item;
    }
}

Que signifie le mot clé yield faire là? Je l'ai vu référencé dans quelques endroits, et une autre question, mais je n'ai pas vraiment compris ce qu'il fait réellement. Je suis habitué à la pensée de rendement dans le sens d'un thread de les céder à un autre, mais qui ne semblent pas pertinents ici.

934voto

Mendelt Points 21583

Le mot clé yield en fait beaucoup de choses ici. La fonction renvoie un objet qui implémente l'interface IEnumerable. Si un appel de fonction commence foreach-ing sur cet objet, la fonction est appelée de nouveau jusqu'à ce qu'il "donne". C'est sucre syntaxique introduit en C# 2.0. Dans les versions antérieures vous deviez créer votre propre IEnumerable et IEnumerator des objets pour faire des trucs comme ça.

La façon la plus simple de comprendre ce type de code est à saisir dans un exemple, définir des points d'arrêt et de voir ce qui se passe.

Essayez de marcher à travers cet exemple:

public void Consumer()
{
    foreach(int i in Integers())
    {
        Console.WriteLine(i.ToString());
    }
}

public IEnumerable<int> Integers()
{
    yield return 1;
    yield return 2;
    yield return 4;
    yield return 8;
    yield return 16;
    yield return 16777216;
}

433voto

Joel Coehoorn Points 190579

Itération. Il crée une machine à États « en coulisses » qui se souvient où vous étiez à chaque cycle supplémentaire de la fonction et les pics vers le haut de là.

286voto

Shivprasad Koirala Points 1327

Rendement a deux utilisations grandes

  1. Il contribue à fournir une itération personnalisée avec sur la création de collections de temp.
  2. Il permet de faire une itération.

Afin d’expliquer les deux points ci-dessus plus démonstrativement, j’ai créé une vidéo simple et même le lien est ici : http://www.youtube.com/watch?v=4fju3xcm21M

155voto

Svend Points 3291

Récemment Raymond Chen a également publié une intéressante série d'articles sur le mot clé yield.

Alors qu'il est théoriquement utilisé pour faciliter la mise en œuvre d'un itérateur modèle, mais peuvent être généralisées à une machine d'état. Aucun point en citant Raymond, la dernière partie également des liens vers d'autres usages (mais l'exemple de la Entin blog esp bon, en montrant comment écrire async coffre-fort à code).

35voto

Konrad Rudolph Points 231505

Intuitivement, le mot-clé renvoie une valeur de la fonction, sans en sortir, c'est à dire dans votre exemple de code, il renvoie l' item de la valeur et puis recommence la boucle. Plus formellement, il est utilisé par le compilateur pour générer du code pour un itérateur. Les itérateurs sont des fonctions qui retournent IEnumerable objets. La MSDN a plusieurs articles à leur sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X