2016-03-05 23 views
5

Uno dei commenti su questo thread: Checking condition and calling continuous method with periods of delay unity, ha detto che:C# Perché non dovrei mai usare le coroutine?

Mai mai mai usare coroutine. Insegnano cattive abitudini dal punto di vista di uno sviluppatore C# e porteranno a un linciaggio se si prende un normale lavoro C#

La mia domanda è, perché è questo? È solo in Unità o in generale? I campioni di realtà virtuale ufficiali di Unity https://www.assetstore.unity3d.com/en/#!/content/51519 li utilizzano molto pesantemente (in particolare l'esempio del flyer) invece di Invoke o Invoke Repeating, anche questi progetti di esempio sono stati rilasciati di recente.

+0

Ciao Martin, oltre alla spiegazione di Cory, semplicemente *** per principianti *** nel 99% dei casi l'unica ragione per cui la persona usa una coroutine è, incredibilmente semplicemente, che non si rendono conto che esiste un Invoke e InvokeRepeating chiama *** o in secondo luogo *** semplicemente non sanno della chiamata Update ***, in Unity. è onestamente solo così semplice. Nota che (se sei un esperto) devi *** usare Invoke/Repeating dove appropriato, e comprendi pienamente che l'aggiornamento e un Coroutine *** sono la stessa cosa ***. – Fattie

+0

Per fare qualcosa di analogico, è un po 'come l'operatore "++" in c. (a) è una pessima idea, la peggiore idea in ingegneria del software (b) di 1000 principianti hobbisti, forse 2 hanno idea di cosa significa, la differenza tra ++ a e a ++ e altre sottigliezze (c) * sicuro *, a volte gli esperti lo usano come una sorta di stenografia per indicare un algoritmo o simili. – Fattie

+0

(Si parla di "unity's lol samples", tutti i docu di unit e samples sono oltre una battuta, una leggenda del settore in inutilità.Nota anche che questo è un campione * di realtà virtuale *, per carità: 99,999% di * beginner * domande relative a "coroutines!" sono come segue: http://stackoverflow.com/a/35807346/294884) – Fattie

risposta

7

Questa è davvero una cosa dell'Unità, sebbene il consiglio sia applicabile ovunque.

Gli sviluppatori non si aspettano di iterare un IEnumerable per modificare lo stato di un programma. Non è ciò che è stato progettato per IEnumerable ed è un comportamento incoerente con tutto .NET.

Ciò che Unity sta facendo è usare yield return come una pseudo-coroutine, e causerà confusione per qualsiasi sviluppatore che non lo conosca.

Nel moderno C# abbiamo asincrono/attendono di realizzare ciò che Unity intendeva, ma Unity è stato creato prima che quella funzione fosse disponibile.

+1

Mentre è molto facile creare una coroutine con 'yield', come lo si costruisce con' async'/'attendi '? È interessante notare che il [wiki] (https://en.wikipedia.org/wiki/Coroutine#Implementations_for_C.23) elenca il modello 'yield' come un modello semi-coroutine, ma non elenca' async'/'await'. – xanatos

+0

Cory, mentre tutti i veri ricordano che Unity è un sistema basato su frame ECS; stanno "torcendo" l'intera cosa un po 'a significare, nient'altro che "vai al prossimo frame". (Non ho idea del perché esiste, dal momento che Update è identico ... cioè accedi al fotogramma successivo, certo, è conveniente ma ne vale la pena?) Naturalmente sei incredibilmente corretto che il 99% delle persone pensa "coroutine"! in Unity hanno qualcosa a che fare con ** threading/timing/waiting **. Certamente, le coroutine non hanno niente a che fare con questi problemi. – Fattie