C# no tiene generales co-rutinas. Una co-rutina general es cuando la co-rutina tiene su propia pila, es decir, puede invocar otros métodos y esos métodos pueden "ceder" valores. La implementación de co-rutinas generales requiere hacer algunas cosas inteligentes con pilas, posiblemente hasta e incluyendo la asignación de montones de pila (las estructuras ocultas que contienen variables locales) en el montón. Esto se puede hacer, algunos idiomas hacen eso (por ejemplo, Scheme), pero es un poco complicado hacerlo bien. Además, muchos programadores encuentran la característica difícil de entender.
Las co-rutinas generales se pueden emular con subprocesos. Cada hilo tiene su propia pila. En una configuración de co-rutina, ambos hilos (el llamador inicial y el hilo para la co-rutina) alternarán el control, nunca se ejecutarán de manera simultánea. El mecanismo de "rendimiento" es entonces un intercambio entre los dos hilos, y como tal es costoso (sincronización, una ida y vuelta a través del kernel y programador del sistema operativo ...). Además, hay mucho espacio para las pérdidas de memoria (la co-rutina debe ser explícitamente "detenida", de lo contrario, el hilo de espera se mantendrá para siempre). Por lo tanto, esto rara vez se hace.
C# proporciona una característica de co-rutina bastardized-down llamada iterators. El compilador de C# convierte automáticamente el código del iterador en una clase de estado específica, con las variables locales convirtiéndose en campos de clase. El rendimiento es entonces, en el nivel VM, un simple return
. Tal cosa es factible siempre que el "rendimiento" se realice desde el código del iterador en sí mismo, no desde un método invocado por el código del iterador. Los iteradores de C# ya cubren muchos casos de uso y los diseñadores de C# no estaban dispuestos a ir más allá en el camino al continuations. Algunas personas sarcásticas están dispuestas a afirmar que la implementación de continuas con todas las funciones habría evitado que C# fuera tan eficiente como su archienemigo Java (las continuaciones eficientes son factibles, pero esto requiere bastante trabajo con el GC y el compilador JIT).
Eric Lippert tiene una publicación de blog en este lugar –
Considere formatear su código un poco más usando pestañas/espacios. – Mizipzor
formateo de pestañas ... de hecho es necesario y no importa el tiempo, es asunto de Python. –