Conoscere l’operatore ‘?’ (Ternary Operator) e l’operatore ‘??’ (Double Question Mark Operator)

Scritto da  Roberto Albano il giovedì 26 maggio 2011  •  Linguaggio: C#   • Livello: 100


Molto cari ai "puristi" del codice, questi operatori consentono di effettuare rapidamente operazioni di verifica e assegnazione del valore di una istanza.

Un esempio vale più di mille parole, per cui vediamo subito che il seguente snippet di codice:

MyClass myInstance = null;
if (myObject != null)
{
    myInstance = myObject;
}
else
{
    myInstance = new MyClass();
}

 

può essere scritto, in virtù del cosiddetto "Ternary Operator", in questo modo:

 
MyClass myInstance = (myObject != null) ? myObject : new MyClass();
 

 

oppure, grazie all'operatore "Double Question Mark Operator", anche in questo modo:

 
MyClass myInstance = myObject ?? new MyClass();
 

 

In questo caso il risultato sarà lo stesso, ma il funzionamento dei due operatori è differente.
Spieghiamo meglio il tutto.

Il "Ternary Operator" funziona in questo modo:

 
myInstance = (condition) ? value_if_condition_is_true : value_if_condition_is_false;
 

 

ovvero, se la condizione (condition) è verificata, allora assegna alla variabile myInstance il valore value_if_condition_is_true altrimenti assegna il valore value_if_condition_is_false.

 Il "Double Question Mark Operator" funziona invece in questo modo:

 
myInstance = value_to_assign_if_it_is_not_null ?? value_to_assign_rather;
 

 

ovvero, myInstance viene valorizzato con value_to_assign_if_it_is_not_null se questo appunto non è un valore null, altrimenti viene assegnato il valore value_to_assign_rather (che tra l'altro potrebbe anche essere null ma non viene ulteriormente controllato).

Quindi mentre il "Ternary Operator" verifica una generica condizione, il "Double Question Mark Operator" verifica se il valore in assegnazione sia valorizzato, altrimenti considera il successivo valore proposto.

Da notare che entrambi gli operatori possono essere combinati in maniera molto elastica, realizzando espressioni complesse e talvolta anche "criptiche" consentendoci di scrivere, per esempio, anche cose del genere:

MyClass temp = null;
myInstance = ( (temp = myObject1 ?? myObject2 ?? myObject3) != null) ? temp : new MyClass();

 

 


Tags: C#

 
x