Isso é praticamente coberto pelas outras respostas, mas "é uma expressão" não explica realmente por que isso é tão útil ...
Em linguagens como C ++ e C #, você pode definir campos somente leitura locais (dentro de um corpo de método) usando-os. Isso não é possível com uma instrução if / then convencional porque o valor de um campo somente leitura deve ser atribuído dentro dessa instrução única:
readonly int speed = (shiftKeyDown) ? 10 : 1;
não é o mesmo que:
readonly int speed;
if (shifKeyDown)
speed = 10; // error - can't assign to a readonly
else
speed = 1; // error
De maneira semelhante, você pode incorporar uma expressão terciária em outro código. Além de tornar o código-fonte mais compacto (e em alguns casos mais legível como resultado), ele também pode tornar o código de máquina gerado mais compacto e eficiente:
MoveCar((shiftKeyDown) ? 10 : 1);
... pode gerar menos código do que ter que chamar o mesmo método duas vezes:
if (shiftKeyDown)
MoveCar(10);
else
MoveCar(1);
Claro, também é uma forma mais conveniente e concisa (menos digitação, menos repetição e pode reduzir a chance de erros se você tiver que duplicar pedaços de código em um if / else). Em casos de "padrão comum" limpo como este:
object thing = (reference == null) ? null : reference.Thing;
... é simplesmente mais rápido de ler / analisar / compreender (uma vez que você esteja acostumado) do que o prolixo if / else equivalente, então pode ajudá-lo a 'grocar' código mais rápido.
Claro, só porque é útil não significa que seja a melhor coisa para usar em todos os casos. Aconselho usá-lo apenas para pequenos trechos de código onde o significado é claro (ou mais claro) usando ?:
- se você usá-lo em um código mais complexo ou aninhar operadores ternários entre si, pode tornar o código terrivelmente difícil de ler .