2016-05-06 25 views
7

ho sempre fatti valere come modoEventi Invocare, H (args) vs EventName .Invoke()

void onSomeEvent(string someArg) { 
    var h = this.EventName; 
    if (h != null) { 
     h(this, new MyEventArgs(someArg)); 
    } 
} 

Oggi VS 2015 mi dice che questo può essere semplificata:

MyEvent?.Invoke(this, new MyEventArgs(someArg)); 

A alcune domande su questo secondo metodo, che io non ho visto prima:

  1. Presumibilmente il ? dopo il nome dell'evento è un controllo se il gestore è nullo?
  2. Supponendo che il gestore non è NULL, .Invoke() sembra abbastanza semplice
  3. Ho usato il primo esempio per anni e mi rendo conto previene condizioni di gara ... presumibilmente il ?.Invoke() del secondo esempio lo fa così?
+0

Perché pensi che la nuova sintassi lo leggerà due volte quando appare solo una volta nella fonte? – SLaks

+0

@SLaks - Non lo so. Forse è la mia mancanza di comprensione di ciò che effettivamente causa la condizione della razza, che tu (e Jon) sembra implicare è causato dalla sua lettura più di una volta? – jleach

+0

Non so chi ha scritto il codice per riconoscere quel particolare pattern di codice e determinare che potrei usare una nuova funzionalità per implementarlo invece ... uno dei tanti motivi per cui VS è l'IDE più impressionante che abbia mai visto. – jleach

risposta

7

Presumibilmente il? dopo che il nome dell'evento è un controllo se il gestore è nullo?

Sì. È l'operatore condizionale nullo, introdotto nel C# 6. È utile in tutti i modi.

Ho usato il primo esempio per anni e ho realizzato che previene le condizioni di gara ... presumibilmente anche lo ?.Invoke() del secondo esempio lo fa? (vedi domanda n. 1)

Sì. Fondamentalmente, sono equivalenti. In particolare, lo non valuta l'espressione MyEvent due volte. Lo valuta una volta e quindi se il risultato è non nullo, chiama Invoke su di esso.

+0

Grazie Jon ... puoi vedere la mia modifica e offrire una panoramica su questo giusto per essere sicuro? (modifica: sembra esserci qualche implicazione sul fatto che la condizione di gara che ho sempre prevenuto è causata leggendo MyEvent due volte ... questo era sconosciuto a me) – jleach

+3

@ jdl134679: Sì, la condizione di gara in 'if (MyEvent! = null) {MyEvent.Invoke (...); } 'è infatti causato dalla lettura due volte - perché può essere non null la prima volta, quindi null la seconda volta. Quindi devi leggerlo solo una volta. È possibile farlo memorizzando il valore in una variabile locale o utilizzando l'operatore condizionale nullo. –

+1

Questo è molto carino: https://msdn.microsoft.com/en-us/library/dn986595.aspx (ref sul C# 6.0 null-condizionale). Mi aspetto che troverò un numero di usi per questo. Grazie ancora! – jleach

Problemi correlati