Это в значительной степени покрывается другими ответами, но «это выражение» на самом деле не объясняет, почему это так полезно ...
В таких языках, как C ++ и C #, вы можете определять локальные поля только для чтения (в теле метода), используя их. Это невозможно с обычным оператором if / then, потому что значение поля readonly должно быть присвоено в этом единственном операторе:
readonly int speed = (shiftKeyDown) ? 10 : 1;
не то же самое, что:
readonly int speed;
if (shifKeyDown)
speed = 10; // error - can't assign to a readonly
else
speed = 1; // error
Аналогичным образом вы можете встроить третичное выражение в другой код. Это не только делает исходный код более компактным (и в некоторых случаях более читабельным), но и делает сгенерированный машинный код более компактным и эффективным:
MoveCar((shiftKeyDown) ? 10 : 1);
... может генерировать меньше кода, чем необходимость дважды вызывать один и тот же метод:
if (shiftKeyDown)
MoveCar(10);
else
MoveCar(1);
Конечно, это также более удобная и краткая форма (меньше набора текста, меньше повторений и может уменьшить вероятность ошибок, если вам нужно дублировать фрагменты кода в if / else). В чистых случаях с «обычным шаблоном» вроде этого:
object thing = (reference == null) ? null : reference.Thing;
... он просто быстрее читать / анализировать / понимать (как только вы к нему привыкнете), чем многословный эквивалент if / else, поэтому он может помочь вам быстрее «разобрать» код.
Конечно, то, что это полезно , не означает, что его лучше всего использовать в каждом случае. Я бы посоветовал использовать его только для коротких фрагментов кода, где смысл ясен (или сделан более понятным) с помощью ?:
- если вы используете его в более сложном коде или вкладываете тернарные операторы друг в друга, это может сделать код ужасно трудным для чтения .