2009-04-12 20 views
6

Quiero saber todo sobre la declaración yield, en una forma fácil de entender.implementación de declaración de rendimiento

He leído sobre la declaración yield y su facilidad al implementar el patrón de iterador. Sin embargo, la mayor parte es muy seca. Me gustaría esconderme y ver cómo Microsoft maneja el rendimiento de retorno.

Además, ¿cuándo utiliza la pausa de rendimiento?

+1

No obtiene tanto "todo" como "fácil de entender", ¡lo siento! FYI, voy a publicar una serie de artículos de blog sobre algunas reflexiones sobre esta característica desde el punto de vista del diseño e implementación de un lenguaje a partir del 2 de julio. –

Respuesta

10

yield funciona construyendo una máquina de estado internamente. Almacena el estado actual de la rutina cuando sale y se reanuda desde ese estado la próxima vez.

Puede usar Reflector para ver cómo el compilador lo implementa.

yield break se usa cuando quiere dejar de devolver resultados. Si usted no tiene un yield break, el compilador asumiría uno al final de la función (al igual que una declaración return; en una función normal)

+0

¿Qué significa "estado actual de la rutina": valores de registro del procesador, puntero de marco, etc.? – Guillaume07

+0

echa un vistazo [coroutines] (http://storm-enroute.com/coroutines/docs/0.6/101/) – Tcraft

+0

@Tcraft La implementación canónica de Microsoft no utiliza diferentes pilas/pilas segmentadas/etc. Usan un objeto asignado en el montón para almacenar el estado. –

5

Como dice Mehrdad, se construye un st comió la máquina.

Además de utilizar el reflector (otra excelente sugerencia) puede encontrar my article on iterator block implementation útil. Sería relativamente simple si no fuera por los bloques finally, ¡pero introducen una dimensión extra de complejidad!

Cuestiones relacionadas