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:
- ogni operando viene valutato al massimo una volta
- 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:
- Viene posto
first()
- Se
first()
valutati per null
, valuta second()
- Se
second()
valutati per null
pure, valuta third()
- 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.
http://stackoverflow.com/questions/6208067/operators-instead-of-ifelse – Mukund
http://stackoverflow.com/questions/3431064/what-is-operator-in-c – Mukund
sopra due sono una grande risposta , spiegando ?? . Per favore guarda. – Mukund