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>();
È stato utile?

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

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