Bad utilizzo di null coalescenza Operator?
-
22-09-2019 - |
Domanda
myFoo = myFoo ?? new Foo();
anziché
if (myFoo == null) myFoo = new Foo();
Ho ragione nel pensare che la prima riga di codice sarà sempre eseguire un incarico? Inoltre, è presente un cattivo uso dell'operatore nullo coalescenza?
Soluzione
Ho confrontato il CIL del codice generato (avendo cura di fare una build di rilascio - con ottimizzare il codice selezionata nelle proprietà del progetto, che corrisponde allo switch /optimize
su csc.exe
). Questo è quello che ho ottenuto (utilizzando VS 2008 - notare che Foo.MaybeFoo()
è un metodo che restituisce talvolta null
, a volte un Foo
)
GetFooWithIf
:
IL_0000: call class Application3.Foo Application3.Foo::MaybeFoo()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: brtrue.s IL_000f
IL_0009: newobj instance void Application3.Foo::.ctor()
IL_000e: stloc.0
IL_000f: ldloc.0
IL_0010: ret
GetFooWithCoalescingOperator
:
IL_0000: call class Application3.Foo Application3.Foo::MaybeFoo()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: dup
IL_0008: brtrue.s IL_0010
IL_000a: pop
IL_000b: newobj instance void Application3.Foo::.ctor()
IL_0010: stloc.0
IL_0011: ldloc.0
IL_0012: ret
In questo modo, lo stesso, tranne per un extra di stack-duplicazione top-of-e pop. Se questo può essere fatto per fare una differenza di prestazioni misurabili, io acquistare un cappello specificamente allo scopo di mangiarlo; quindi, andare con quello che si sente offre una migliore leggibilità.
(edit) oh, e il jitter potrebbe essere abbastanza intelligente per sbarazzarsi di anche che differenza!
Altri suggerimenti
Non credo che questo è un cattivo uso dell'operatore null-coalescenza. Durante la lettura del codice, è più breve e conciso possibile, e l'intento del codice è ovvia.
E 'vero che utilizzando l'operatore null coalescenza in questo modo, avrai sempre un incarico, ma io non mi preoccuperei di questo. (E se davvero si rivela essere un problema di prestazioni, sai già come risolvere il problema).
Sei corretta in quanto la prima linea sarà sempre fare un incarico. Io non mi preoccuperei che a meno che il codice viene eseguito molto spesso.