Jest to prawie omówione w innych odpowiedziach, ale „to wyrażenie” nie wyjaśnia, dlaczego jest to tak przydatne ...
W językach takich jak C ++ i C # można za ich pomocą definiować lokalne pola tylko do odczytu (w treści metody). Nie jest to możliwe w przypadku konwencjonalnej instrukcji jeśli / to, ponieważ wartość pola tylko do odczytu musi zostać przypisana w ramach tej pojedynczej instrukcji:
readonly int speed = (shiftKeyDown) ? 10 : 1;
to nie to samo co:
readonly int speed;
if (shifKeyDown)
speed = 10; // error - can't assign to a readonly
else
speed = 1; // error
W podobny sposób możesz osadzić trzeciorzędne wyrażenie w innym kodzie. Oprócz tego, że kod źródłowy jest bardziej zwarty (aw niektórych przypadkach bardziej czytelny), może również sprawić, że wygenerowany kod maszynowy będzie bardziej zwarty i wydajny:
MoveCar((shiftKeyDown) ? 10 : 1);
... może generować mniej kodu niż konieczność dwukrotnego wywoływania tej samej metody:
if (shiftKeyDown)
MoveCar(10);
else
MoveCar(1);
Oczywiście jest to również wygodniejsza i bardziej zwięzła forma (mniej pisania, mniej powtórzeń i może zmniejszyć ryzyko błędów, jeśli musisz zduplikować fragmenty kodu w instrukcji if / else). W czystych „typowych wzorcach”, takich jak ten:
object thing = (reference == null) ? null : reference.Thing;
... jest po prostu szybszy do czytania / analizowania / rozumienia (kiedy już się do tego przyzwyczaisz) niż rozwlekły odpowiednik if / else, więc może pomóc ci w szybszym "grokowaniu" kodu.
Oczywiście tylko dlatego, że jest użyteczny , nie oznacza, że najlepiej jest go używać w każdym przypadku. Radziłbym używać go tylko do krótkich fragmentów kodu, których znaczenie jest jasne (lub bardziej zrozumiałe), używając ?:
- jeśli użyjesz go w bardziej złożonym kodzie lub zagnieżdżasz w sobie operatory trójskładnikowe, może to bardzo utrudnić odczytanie kodu .