2015-04-10 11 views
10

So che facendo (myValue ?? new SomeClass()) è simile a (myValue == null ? new SomeClass() : myValue)Does nulla di cache operatore coalescenza il risultato in C#

Ma per curiosità, non v'è alcun miglioramento delle prestazioni quando chiamo una funzione, dire (getResult() ?? new SomeClass()). getResult() verrà eseguito due volte? Sembra non intuitivo dato che ho specificato la chiamata al metodo solo una volta.

+0

http://stackoverflow.com/questions/6208067/operators-instead-of-ifelse – Mukund

+0

http://stackoverflow.com/questions/3431064/what-is-operator-in-c – Mukund

+0

sopra due sono una grande risposta , spiegando ?? . Per favore guarda. – Mukund

risposta

15

Bene, se con "memorizzazione nella cache" si intende memorizzare in una variabile temporanea, quindi sì.

Questo costrutto:

var result = (getResult() ?? new SomeClass()); 

può essere pensato per essere equivalente a questo:

var <temp> = getResult(); 
if (<temp> == null) 
    <temp> = new SomeClass(); 
result = <temp>; 

Questo indica anche che la seconda parte, l'operando dopo ?? non viene eseguito a tutti se il primo operando non è null.

Quindi, per rispondere alle vostre domande concrete:

  1. ogni operando viene valutato al massimo una volta
  2. Il secondo operando viene valutato solo se il primo restituisce null

noti inoltre che è può catena questi:

var result = first() ?? second() ?? third() ?? fourth(); 

Quale resu LTS:

  1. Viene posto first()
  2. Se first() valutati per null, valuta second()
  3. Se second() valutati per null pure, valuta third()
  4. Se tutto quanto sopra valutati per null, infine valuta il fourth

Il risultato è il primo valore non nullo (non previsto) restituito.


Questo tipo di codice è in procinto di ottenere ancora meglio nel nuovo C# con il nuovo operatore ?.:

var result = first?.second?.third; 

Questo è fondamentale la gestione ., vale a dire. si leggerà la second membro della first, e quindi il membro third di qualsiasi second è, ma si fermerà al primo null, e sarà anche fare in modo di valutare ogni passo una sola volta:

(obj as IDisposable)?.Dispose(); 

obj as IDisposable solo la volontà valutare una volta.

TryGetObjectToSave()?.Save(); 

sarà solo chiamare TryGetObjectToSave() una volta, e se restituisce qualcosa, sarà chiamato il metodo Save() su quel qualcosa.

Problemi correlati