C# non ha generali co-routine. Un co-routine generale è dove la co-routine ha il proprio stack, cioè può invocare altri metodi e quei metodi possono "produrre" valori. L'implementazione di co-routines generali richiede la creazione di alcune cose intelligenti con stack, possibilmente fino all'allocazione di stack frame (le strutture nascoste che contengono variabili locali) nello heap. Questo può essere fatto, alcune lingue lo fanno (ad esempio Scheme), ma è alquanto complicato farlo correttamente. Inoltre, molti programmatori trovano la funzione difficile da capire.
Le co-routine generali possono essere emulate con le filettature. Ogni thread ha il suo stack. In una configurazione di co-routine, entrambi i thread (il chiamante iniziale e il thread per la co-routine) alterneranno il controllo, non verranno mai eseguiti simultaneamente. Il meccanismo "yield" è quindi uno scambio tra i due thread e, in quanto tale, è costoso (sincronizzazione, un roundtrip attraverso il kernel del sistema operativo e lo scheduler ...). Inoltre, vi è molto spazio per perdite di memoria (la co-routine deve essere esplicitamente "arrestata", altrimenti il thread in attesa si bloccherà per sempre). Quindi, questo è raramente fatto.
C# fornisce una funzione di co-routine bastardizzata denominata iteratori. Il compilatore C# converte automaticamente il codice iteratore in una specifica classe di stato, con le variabili locali che diventano campi di classe. La resa è quindi, a livello di VM, un semplice return
. Una cosa del genere è fattibile fintanto che il "rendimento" viene eseguito dal codice iteratore stesso, non da un metodo invocato dal codice iteratore. Gli iteratori C# coprono già molti casi d'uso e i progettisti C# non erano disposti ad andare più avanti sulla strada fino a continuations. Alcune persone sarcastiche sono ansiose di affermare che implementare continui con funzionalità complete avrebbe impedito a C# di essere efficiente quanto il suo arci-nemico Java (sono possibili fattibili continuazioni, ma ciò richiede un po 'di lavoro con il GC e il compilatore JIT).
fonte
2010-03-22 15:41:04
Eric Lippert ha un post sul blog da qualche parte –
Considerare la formattazione del codice un po 'di più usando tab/spazi. La formattazione delle schede – Mizipzor
... effettivamente è necessaria e non importa di tempo, è questione di Python. –