Questo è più o meno trattato dalle altre risposte, ma "è un'espressione" non spiega davvero perché sia così utile ...
In linguaggi come C ++ e C #, puoi definire campi di sola lettura locali (all'interno del corpo di un metodo) utilizzandoli. Questo non è possibile con un'istruzione if / then convenzionale perché il valore di un campo di sola lettura deve essere assegnato all'interno di quella singola istruzione:
readonly int speed = (shiftKeyDown) ? 10 : 1;
non è lo stesso di:
readonly int speed;
if (shifKeyDown)
speed = 10; // error - can't assign to a readonly
else
speed = 1; // error
In modo simile è possibile incorporare un'espressione terziaria in un altro codice. Oltre a rendere il codice sorgente più compatto (e in alcuni casi più leggibile di conseguenza) può anche rendere il codice macchina generato più compatto ed efficiente:
MoveCar((shiftKeyDown) ? 10 : 1);
... può generare meno codice rispetto a dover chiamare lo stesso metodo due volte:
if (shiftKeyDown)
MoveCar(10);
else
MoveCar(1);
Naturalmente, è anche una forma più conveniente e concisa (meno battitura, meno ripetizioni e può ridurre la possibilità di errori se devi duplicare blocchi di codice in un if / else). In casi "pattern comuni" puliti come questo:
object thing = (reference == null) ? null : reference.Thing;
... è semplicemente più veloce da leggere / analizzare / comprendere (una volta che ci sei abituato) rispetto al prolisso equivalente if / else, quindi può aiutarti a 'grok' il codice più velocemente.
Certo, solo perché è utile non significa che sia la cosa migliore da usare in ogni caso. Consiglierei di usarlo solo per brevi bit di codice in cui il significato è chiaro (o reso più chiaro) usando ?:
: se lo usi in un codice più complesso, o annidi operatori ternari l'uno nell'altro, può rendere il codice terribilmente difficile da leggere .