La versione (c) è una forma di passaggio continuo , non è affatto un evento. È un metodo completamente diverso di flusso di controllo e può essere utilizzato per esprimere alcuni tipi complessi di flusso di controllo che sono difficili da esprimere con costrutti primitivi come loop e condizionali. Ad esempio, è la base per asincronia in C # 5 . Tutta la await
lo fa, in sostanza, è una continuazione.
È certamente un costrutto valido, ma la risposta a quando si dovrebbe usare questo per la programmazione event-driven è mai , perché non è un evento. Non ci sono sottoscrizioni di alcun tipo; la richiamata è accoppiata alla chiamata al metodo. Inoltre, non puoi avere più abbonamenti, che puoi avere con qualsiasi vecchio event
.
Quindi scende una scelta tra (a) usando un EventHandler
o (b) semplice usando un MyEventHandler
personalizzato con i dati di evento. E la risposta è semplice: usa un evento personalizzato se ci sono dati importanti, transitori associati all'evento.
Immagina di dover eseguire una query sulla posizione del cursore ogni volta che hai eseguito un gestore di eventi MouseDown
. Sarebbe del tutto inaffidabile, perché la posizione del mouse potrebbe e spesso cambierebbe tra il momento in cui è stato sparato l'evento e il momento in cui è stato gestito. D'altra parte, un evento Initialized
è piuttosto auto-esplicativo; succederà solo una volta nella vita di un oggetto e non c'è molto altro da dire al riguardo se non "OK, sono pronto!".
Quindi, in sintesi, (a) usa il EventHandler
predefinito quando non hai nient'altro di interessante da dire, (b) usa un strong% tip_to% quando lo fai, e (c) non usa CPS per le notifiche degli eventi.