2009-04-12 5 views
6

Voglio sapere tutto sulla dichiarazione yield, in una forma facile da capire.implementazione dichiarazione di rendimento

Ho letto sull'istruzione yield e sulla sua facilità nell'implementazione del pattern iteratore. Tuttavia, la maggior parte è molto secca. Mi piacerebbe avere sotto le copertine e vedere come Microsoft gestisce rendimento di ritorno.

Inoltre, quando si utilizza la pausa di rendimento?

+1

Non si ottiene "tutto" e "facile da capire", mi dispiace! Per la cronaca, pubblicherò una serie di articoli di blog su alcune riflessioni su questa funzionalità dal punto di vista del design e dell'implementazione del linguaggio a partire dal 2 luglio. –

risposta

10

yield funziona costruendo internamente una macchina a stati. Memorizza lo stato corrente della routine quando esce e riprende da quello stato la volta successiva.

È possibile utilizzare Reflector per vedere come viene implementato dal compilatore.

yield break viene utilizzato quando si desidera interrompere la restituzione dei risultati. Se non si dispone di un yield break, il compilatore avrebbe assunto uno alla fine della funzione (proprio come una dichiarazione return; in una funzione normale)

+0

cosa significa "stato attuale della routine": valori del registro del processore, puntatore del frame ecc.? – Guillaume07

+0

dai un'occhiata [coroutines] (http://storm-enroute.com/coroutines/docs/0.6/101/) – Tcraft

+0

@Tcraft L'implementazione canonica di Microsoft non utilizza stack diversi/stack segmentati/ecc. Usano un oggetto assegnato all'heap per memorizzare lo stato. –

5

Come dice Mehrdad, si costruisce una st mangiato la macchina.

Oltre a utilizzare Reflector (un altro eccellente suggerimento), è possibile trovare utile my article on iterator block implementation. Sarebbe relativamente semplice se non fosse per i blocchi finally - ma essi presentano un'intera dimensione extra di complessità!