J'ai vu cette syntaxe dans MSDN:, yield break
mais je ne sais pas ce qu'elle fait. Est-ce que quelqu'un sait?
494
J'ai vu cette syntaxe dans MSDN:, yield break
mais je ne sais pas ce qu'elle fait. Est-ce que quelqu'un sait?
MyList.Add(...)
simplement le faireyield return ...
. Si vous devez sortir prématurément de la boucle et renvoyer la liste de sauvegarde virtuelle que vous utilisezyield break;
Réponses:
Il spécifie qu'un itérateur a pris fin. Vous pouvez penser
yield break
à unereturn
déclaration qui ne renvoie pas de valeur.Par exemple, si vous définissez une fonction comme un itérateur, le corps de la fonction peut ressembler à ceci:
Notez qu'après que la boucle a terminé tous ses cycles, la dernière ligne est exécutée et vous verrez le message dans votre application console.
Ou comme ça avec
yield break
:Dans ce cas, la dernière instruction n'est jamais exécutée car nous avons quitté la fonction plus tôt.
la source
break
au lieu deyield break
dans votre exemple ci-dessus? Le compilateur ne s'en plaint pas.break
dans ce cas arrêterait la boucle, mais il n'interromprait pas l'exécution de la méthode, ainsi la dernière ligne serait exécutée et le "Texte ne me verra pas" serait réellement vu.NullReferenceException
énumérateur de IEnumerable, alors que, avec yield break, vous ne le faites pas (il existe une instance sans élément).yield return x
alertes du compilateur, vous voulez que cette méthode soit du sucre syntaxique pour créer unEnumerator
objet. Cet énumérateur a une méthodeMoveNext()
et une propriétéCurrent
. MoveNext () exécute la méthode jusqu'à uneyield return
instruction et transforme cette valeur enCurrent
. La prochaine fois que MoveNext est appelé, l'exécution se poursuit à partir de là.yield break
définit Current sur null, signalant la fin de cet énumérateur, de sorte queforeach (var x in myEnum())
se termine.Termine un bloc itérateur (par exemple, dit qu'il n'y a plus d'éléments dans l'IEnumerable).
la source
yield
mot-clé, vous pouvez parcourir la collection dans les deux sens, en outre, vous pouvez prendre tous les éléments de collection suivants non consécutifsyield
de le faire. je ne dis pas que vous vous trompez, je vois ce que vous proposez; mais, académiquement, il n'y a pas d'itérateurs dans .NET, seulement des énumérateurs (une direction, en avant) - contrairement à stdc ++, il n'y a pas de "cadre d'itérateur générique" défini dans le CTS / CLR. LINQ aide à combler l'écart avec les méthodes d'extension qui utilisentyield return
et également les méthodes de rappel , mais ce sont des méthodes d'extension de première classe, pas des itérateurs de première classe. le résultatIEnumerable
ne peut pas itérer lui-même dans une autre direction que vers l'avant par rapport à l'appelant.Dit à l'itérateur qu'il est arrivé à la fin.
Par exemple:
la source
yield
fait en sorte qu'uneIEnumerable<T>
méthode se comporte de manière similaire à un thread planifié en coopération (par opposition à préventivement).yield return
est comme un thread appelant une fonction "Schedule" ou "Sleep" pour abandonner le contrôle du CPU. Tout comme un thread, laIEnumerable<T>
méthode récupère les contrôles au point immédiatement après, toutes les variables locales ayant les mêmes valeurs qu'avant le abandon du contrôle.yield break
est comme un fil qui atteint la fin de sa fonction et se termine.Les gens parlent d'une "machine d'état", mais une machine d'état n'est qu'un "fil". Un thread a un certain état (c'est-à-dire des valeurs de variables locales), et chaque fois qu'il est planifié, il prend une ou plusieurs actions afin d'atteindre un nouvel état. Le point clé à ce sujet
yield
est que, contrairement aux threads du système d'exploitation auxquels nous sommes habitués, le code qui l'utilise est figé dans le temps jusqu'à ce que l'itération soit avancée ou terminée manuellement.la source
L'ensemble du sujet des blocs d'itérateur est bien couvert dans ce chapitre échantillon gratuit du livre de Jon Skeet C # en profondeur .
la source
L'
yield break
instruction arrête l'énumération. En effet,yield break
termine l'énumération sans retourner aucun élément supplémentaire.Considérez qu'il existe en fait deux façons dont une méthode d'itérateur peut arrêter l'itération. Dans un cas, la logique de la méthode pourrait naturellement quitter la méthode après avoir renvoyé tous les éléments. Voici un exemple:
Dans l'exemple ci-dessus, la méthode itérateur arrêtera naturellement de s'exécuter une fois que les
maxCount
nombres premiers auront été trouvés.L'
yield break
instruction est une autre façon pour l'itérateur de cesser d'énumérer. C'est un moyen de sortir tôt du dénombrement. Voici la même méthode que ci-dessus. Cette fois, la méthode a une limite sur la durée d'exécution de la méthode.Remarquez l'appel à
yield break
. En effet, il quitte précocement l'énumération.Remarquez également que les
yield break
travaux diffèrent d'une simple plainebreak
. Dans l'exemple ci-dessus,yield break
quitte la méthode sans appelerDebug.WriteLine(..)
.la source
Ici http://www.alteridem.net/2007/08/22/the-yield-statement-in-c/ est un très bon exemple:
et explication, que si une
yield break
instruction est frappée dans une méthode, l'exécution de cette méthode s'arrête sans retour. Il y a des situations temporelles, lorsque vous ne voulez pas donner de résultat, vous pouvez utiliser la rupture de rendement.la source
la rupture de rendement n'est qu'un moyen de dire retour pour la dernière fois et ne renvoie aucune valeur
par exemple
la source
Si ce que vous entendez par «qu'est-ce que la rupture de rendement fait vraiment», c'est «comment ça marche» - Voir le blog de Raymond Chen pour plus de détails https://devblogs.microsoft.com/oldnewthing/20080812-00/?p=21273
Les itérateurs C # génèrent du code très compliqué.
la source
Le mot clé yield est utilisé avec le mot clé return pour fournir une valeur à l'objet énumérateur. yield return spécifie la ou les valeurs renvoyées. Lorsque la déclaration de rendement est atteinte, l'emplacement actuel est stocké. L'exécution est redémarrée à partir de cet emplacement lors du prochain appel de l'itérateur.
Pour expliquer la signification à l'aide d'un exemple:
Les valeurs renvoyées lors de cette itération sont: 0, 2, 5.
Il est important de noter que la variable de compteur dans cet exemple est une variable locale. Après la deuxième itération qui retourne la valeur de 2, la troisième itération commence là où elle était avant, tout en conservant la valeur précédente de la variable locale nommée counter qui était 2.
la source
yield break
faityield return
supporte réellement le retour de plusieurs valeurs. Ce n'est peut-être pas ce que vous vouliez dire, mais c'est ainsi que je l'ai lu.yield break
est qu'il ne contient pas d'énumérateur au niveau de la langue tel qu'unforeach
- lorsque vous utilisez un énumérateur, layield break
valeur réelle est fournie. cet exemple ressemble à une boucle déroulée. vous ne verrez presque jamais ce code dans le monde réel (nous pouvons tous penser à certains cas extrêmes, bien sûr) également, il n'y a pas d'itérateur ici. le "bloc itérateur" ne peut pas s'étendre au-delà de la méthode pour des raisons de spécification de langage. ce qui est réellement retourné est un "énumérable", voir aussi: stackoverflow.com/questions/742497/…