C# e null-coalescing

in C#

C# e null-coalescing

Reading Time: 2 minutes

In C# l’operatore ?? restituisce il valore alla sua sinistra nel caso in cui non sia nullo, in caso contrario viene valutata l’espressione alla sua destra. In pratica è un operatore binario che consente di semplificare il controllo di variabili null. Può essere utilizzato sia con variabili di tipo valore sia con variabili di tipo riferimento. Analizziamo la seguente espressione

x ?? y

il cui significato può essere espresso come “Se la variabile x non è nulla, viene considerato il valore di x, in caso contrario il valore di y. L’operatore ?? è un operatore di tipo associativo a destra, cioè il raggruppando dell’ordine di esecuzione parte da destra. Nell’esempio:

  x ?? y ?? z 

l’ordine con cui verrà considerato a runtime è il seguente:

x ?? ( y ?? z)

Null-coalescing nel corso degli anni

Consideriamo il seguente codice :

if (user == null)
{
    user = new DefaultUser("Pippo");
}

in cui viene verificato se la variabile user è null e nel caso viene settata ad un oggetto di tipo DefaultUser. Per semplificare il codice precedente, rendendolo anche più leggibile sono stati introdotti, nel corso degli anni, differenti tipi di operatori.

La prima semplificazione può essere fatta utilizzando l’operatore condizionale ? :

user = (user == null) ? new DefaultUser("Pippo") : user;

seguendo la sintassi della lingua parlata, ci stiamo chiedendo se la variabile user è di tipo null, e in caso positivo viene creato un nuovo oggetto di tipo DefaultUser(‘pippo’), in caso contrario viene assegnato il valore della variabile stessa.

Una variante più compatta del codice precedente è la seguente:

user = user ?? new DefaultUser("Pippo");

ce fa uso dell’operatore ?? , eliminando di fatto il codice per il controllo della variabile a null.

In C# 8.0 è stato introdotto un nuovo operatore ??= che consente di semplificare ulteriormente la scrittura del codice:

user ??= new DefaultUser("Pippo");

Sicuramente l’introduzione di questo nuovo operatore consente di scrivere codice molto piu’ compatto e sicuramente leggibile.