Dies wird so ziemlich von den anderen Antworten abgedeckt, aber "es ist ein Ausdruck" erklärt nicht wirklich, warum das so nützlich ist ...
In Sprachen wie C ++ und C # können Sie damit lokale schreibgeschützte Felder (innerhalb eines Methodenkörpers) definieren. Dies ist mit einer herkömmlichen if / then-Anweisung nicht möglich, da der Wert eines schreibgeschützten Felds innerhalb dieser einzelnen Anweisung zugewiesen werden muss:
readonly int speed = (shiftKeyDown) ? 10 : 1;
ist nicht dasselbe wie:
readonly int speed;
if (shifKeyDown)
speed = 10; // error - can't assign to a readonly
else
speed = 1; // error
Auf ähnliche Weise können Sie einen tertiären Ausdruck in anderen Code einbetten. Der Quellcode wird nicht nur kompakter (und in einigen Fällen dadurch besser lesbar), sondern auch der generierte Maschinencode kompakter und effizienter:
MoveCar((shiftKeyDown) ? 10 : 1);
... kann weniger Code generieren, als dieselbe Methode zweimal aufrufen zu müssen:
if (shiftKeyDown)
MoveCar(10);
else
MoveCar(1);
Natürlich ist es auch eine bequemere und präzisere Form (weniger Eingabe, weniger Wiederholung und kann die Wahrscheinlichkeit von Fehlern verringern, wenn Sie Codeblöcke in einem if / else duplizieren müssen). In sauberen "Common Pattern" -Fällen wie diesen:
object thing = (reference == null) ? null : reference.Thing;
... es ist einfach schneller zu lesen / zu analysieren / zu verstehen (sobald Sie daran gewöhnt sind) als das langatmige if / else-Äquivalent, sodass Sie Code schneller "groken" können.
Natürlich nur , weil es ist nützlich , bedeutet nicht , es das Beste ist , zu verwenden , in jedem Fall. Ich würde empfehlen, es nur für kurze Codebits zu verwenden, bei denen die Bedeutung durch Verwendung klar (oder klarer) wird. ?:
Wenn Sie es in komplexerem Code verwenden oder ternäre Operatoren ineinander verschachteln, kann es schrecklich schwierig sein, Code zu lesen .