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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top