2009-04-12 13 views
6

Je veux savoir tout sur l'instruction yield, dans une forme facile à comprendre.la mise en œuvre de l'instruction

J'ai lu à propos de l'instruction yield et sa facilité lors de l'implémentation du pattern itérateur. Cependant, la plus grande partie est très sèche. Je voudrais aller sous les couvertures et voir comment Microsoft gère le rendement de retour.

En outre, quand utilisez-vous la rupture de rendement?

+1

Vous n'obtenez pas à la fois «tout» et «facile à comprendre», désolé! Pour info, je vais poster une série d'articles de blog sur quelques réflexions sur cette fonctionnalité du point de vue de la conception et de la mise en œuvre du langage à partir du 2 juillet. –

Répondre

10

yield fonctionne en construisant une machine d'état en interne. Il stocke l'état actuel de la routine quand il quitte et reprend à partir de cet état la prochaine fois.

Vous pouvez utiliser Reflector pour voir comment il est implémenté par le compilateur.

yield break est utilisé lorsque vous souhaitez arrêter de renvoyer des résultats. Si vous ne disposez pas d'un yield break, le compilateur assumerait une à la fin de la fonction (comme une déclaration return; dans une fonction normale)

+0

que signifie "état actuel de la routine": valeurs du registre du processeur, pointeur de trame, etc.? – Guillaume07

+0

jetez un coup d'oeil [coroutines] (http://storm-enroute.com/coroutines/docs/0.6/101/) – Tcraft

+0

@Tcraft L'implémentation canonique de Microsoft n'utilise pas différentes piles/piles segmentées/etc. Ils utilisent un objet affecté par le tas pour stocker l'état. –

5

Comme le dit Mehrdad, il construit un st mangé la machine.

En plus d'utiliser Reflector (une autre excellente suggestion), vous pouvez trouver my article on iterator block implementation utile. Il serait relativement simple si ce n'était pas pour finally blocs - mais ils introduisent toute une dimension supplémentaire de la complexité!