Cosa ne pensi ?? = operatore in C #? [chiuso]
-
23-09-2019 - |
Domanda
Pensi che C # sosterrà una cosa del genere ?? operatore =?
Al posto di questo:
if (list == null)
list = new List<int>();
Potrebbe essere possibile scrivere:
list ??= new List<int>();
Ora, potrei usare (ma mi sembra non ben leggibile):
list = list ?? new List<int>();
Soluzione
Ho sempre voluto qualcosa di simile. Io lo uso molto più spesso di quanto la ??
di per sé.
Quello che voglio davvero, però, è una forma di operatore che permette di dereference l'oggetto solo se non nullo. Per sostituire questo:
int count = (list != null)? list.Count : 0
con qualcosa di simile:
int count = list??.Count : 0
Il che sarebbe particolarmente utile per me con lunghe catene di riferimenti (cattiva progettazione, lo so), ma per esempio
int count = foo??.bar??.baz??.list??.Count : 0
Questa non è attualmente possibile con ??
perché si può solo dire "assegnare foo, o in alternativa se nulla", ma non "assegnare a un proprietà di foo, o in alternativa, se nullo. "
Altri suggerimenti
Personalmente ritengo solo la seconda espansione senso (in termini di mantenere lungo la stessa linea +=
ecc):
list = list ?? new List<int>();
ma ad essere onesti lo trovo un po 'inutile. La gente di solito "ottenere" i += 5;
, ma tendono ad avere un problema con null-coalescenza (??
). Aggiungere un operatore di null-coalescenza-assegnazione e ... beh, non vedo che finisce bene.
Personalmente prediligo il codice originale:
if(list == null) { list = new List<int>(); }
....
Inoltre - prendere in considerazione: in tutti gli altri +=
, -=
ecc - il lato destro è sempre valutata. In questo caso non sarebbe (in alcuni casi). Che aggiunge ancora più confusione. Con questo intendo:
i += SomethingCriticalThatMustBeCalled(); // fine - always runs
j ??= SomethingElseCriticalThatMustBeCalled(); // is this run? if j != null?
Un trucco che ho trovato da qualche parte qui su StackOverflow è stato quello di fare qualcosa di simile ...
private List<string> myList;
public List<string> MyProp
{
get { return myList ?? (myList= new List<string>()); }
}
... è forse in grado di utilizzare simili eval pigro nel codice.
Mi piace - è un modo succinto bello per esprimere un'espressione lazy-carico. Se sia o non viene aggiunto alla lingua è un'altra cosa - come Eric Lippert ama sottolineare , nuove funzioni richiedono una notevole quantità di lavoro per implementare e come tali devono contribuire con una significativa netto positivo alla lingua, al fine di essere inclusi .
A meno che non ho letto la tua domanda sbagliata, che operatore non esiste in C #: http://msdn.microsoft.com/en-us/library/ms173224 (VS.80) aspx