Jakie są zalety i wady operatora?: W porównaniu ze standardową instrukcją if-else. Te oczywiste to:
Warunkowe?: Operator
- Krótsze i bardziej zwięzłe w przypadku bezpośrednich porównań wartości i przypisań
- Nie wydaje się być tak elastyczny jak konstrukcja if / else
Standardowe Jeśli / Jeszcze
- Może być stosowany w większej liczbie sytuacji (takich jak wywołania funkcji)
- Często są niepotrzebnie długie
Czytelność wydaje się różna dla każdego w zależności od stwierdzenia. Przez chwilę po pierwszym kontakcie z operatorem?: Zajęło mi trochę czasu, zanim dokładnie przeanalizowałem, jak to działa. Czy poleciłbyś używanie go wszędzie tam, gdzie to możliwe, czy trzymanie się if / else, biorąc pod uwagę, że pracuję z wieloma nie-programistami?
c#
conditional-operator
KChaloux
źródło
źródło
SomeCheck() ? DoFirstThing() : DoSecondThing();
- musisz użyć wyrażenia, aby zwrócić wartość.Odpowiedzi:
Zasadniczo zalecałbym używanie go tylko wtedy, gdy wynikowe stwierdzenie jest wyjątkowo krótkie i przedstawia znaczny wzrost zwięzłości w stosunku do odpowiednika if / else bez utraty czytelności.
Dobry przykład:
Zły przykład:
źródło
return
udziału w wyniku operacji trójskładnikowej. Na przykład:check() ? return 1 : return 0;
nie zadziała, alereturn check() ? 1 : 0;
będzie. Zawsze fajnie jest znaleźć te małe dziwactwa w programowaniu.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:
to nie to samo co:
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:
... może generować mniej kodu niż konieczność dwukrotnego wywoływania tej samej metody:
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:
... 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 .źródło
const
jest stałe, tj. nie można go zmienić po wykonaniu instrukcji, w której jest zadeklarowane.readonly
? Zawsze myślałemconst
, że oznacza „ rozwiązany w czasie kompilacji i wbudowany wszędzie tam, gdzie jest używany ”.Zwykle wybieram operator trójskładnikowy, gdy w przeciwnym razie miałbym dużo zduplikowanego kodu.
W przypadku operatora trójskładnikowego można to osiągnąć w następujący sposób.
źródło
aVal = a > 0 ? a : -a; answer = compute(aVal,b,c,d,e);
Zwłaszcza jeślib
,c
,d
ie
wymagał leczenia zbyt.compute(...)
toa > 0 ? a : -1
, który jest oceniany oddzielnie od pozostałych argumentów oddzielonych przecinkami. W każdym razie, niestety, C ++ nie ma notacji, jaką zakłada twoje pytanie do obsługi „krotek” wartości oddzielonych przecinkami, więc naweta > 0 ? (a, b, c, d, e) : (-a, b, c, d, e)
jest nielegalne i nie ma nic podobnego, co działałoby bez zmiancompute
.Uważam to za szczególnie pomocne podczas tworzenia stron internetowych, jeśli chcę ustawić zmienną na wartość wysłaną w żądaniu, jeśli jest zdefiniowana, lub na jakąś wartość domyślną, jeśli nie jest.
źródło
Naprawdę fajne użycie to:
źródło
foo
jest fałszywe, całość zostanie oceniona na 4 bez wykonywania innych testów.Operator warunkowy świetnie sprawdza się w krótkich warunkach, takich jak ten:
Używam go od czasu do czasu, ponieważ napisanie czegoś w ten sposób zajmuje mniej czasu ... niestety to rozgałęzienie może czasami zostać pominięte przez innego programistę przeglądającego Twój kod. Poza tym kod nie jest zwykle taki krótki, więc zwykle pomagam w czytelności, umieszczając znak? i: w oddzielnych wierszach, na przykład:
Jednak dużą zaletą używania bloków if / else (i dlaczego je preferuję) jest to, że łatwiej jest wejść później i dodać dodatkową logikę do gałęzi,
lub dodaj kolejny warunek:
Ostatecznie chodzi więc o wygodę dla Ciebie teraz (krótszą w użyciu:?) Vs. wygodę dla Ciebie (i innych) później. To kwestia oceny ... ale podobnie jak w przypadku wszystkich innych kwestii związanych z formatowaniem kodu, jedyną prawdziwą zasadą jest spójność i wizualna uprzejmość dla tych, którzy muszą utrzymywać (lub oceniać!) Twój kod.
(cały kod skompilowany na oko)
źródło
Jedną rzeczą do rozpoznania podczas używania operatora trójskładnikowego jest to, że jest to wyrażenie, a nie instrukcja.
W językach funkcjonalnych, takich jak schemat, rozróżnienie nie istnieje:
(jeśli (> ab) ab)
Warunkowe?: Operator „Nie wydaje się być tak elastyczny jak konstrukcja if / else”
W językach funkcjonalnych tak jest.
Podczas programowania w językach imperatywnych stosuję operator trójskładnikowy w sytuacjach, w których zwykle używałbym wyrażeń (przypisanie, instrukcje warunkowe itp.).
źródło
Chociaż powyższe odpowiedzi są ważne i zgadzam się, że czytelność jest ważna, należy wziąć pod uwagę 2 dalsze kwestie:
To sprawia, że użycie trójskładnika jest szczególnie zwięzłe:
Jeśli masz typów
T1
iT2
które mogą być zarówno niejawnie konwertowane doT
, a następnie poniżej robi nie praca:(ponieważ kompilator próbuje określić typ wyrażenia trójskładnikowego i nie ma konwersji między
T1
aT2
).Z drugiej strony
if/else
działa poniższa wersja:ponieważ
T1
jest konwertowanyT
i tak jestT2
źródło
Czasami może to ułatwić odczytanie przypisania wartości bool na pierwszy rzut oka:
źródło
Jeśli ustawiam wartość i wiem, że zawsze będzie to jeden wiersz kodu, zwykle używam operatora trójargumentowego (warunkowego). Jeśli jest szansa, że mój kod i logika zmienią się w przyszłości, używam if / else, ponieważ jest to bardziej zrozumiałe dla innych programistów.
Może Cię zainteresować ?? operator .
źródło
Zaletą operatora warunkowego jest to, że jest operatorem. Innymi słowy, zwraca wartość. Ponieważ
if
jest instrukcją, nie może zwrócić wartości.źródło
Zalecałbym ograniczenie używania operatora trójargumentowego (? :) do prostego przypisania pojedynczego wiersza w logice if / else. Coś przypominającego ten wzór:
Można go łatwo przekonwertować na:
Unikałbym używania operatora trójskładnikowego w sytuacjach, które wymagają if / else if / else, zagnieżdżonej logiki if / else lub if / else branch, która skutkuje obliczeniem wielu wierszy. Zastosowanie operatora trójargumentowego w takich sytuacjach prawdopodobnie spowodowałoby nieczytelny, zagmatwany i niemożliwy do zarządzania kod. Mam nadzieję że to pomoże.
źródło
Korzystanie z funkcji? operator w np. MS Visual C ++, ale jest to naprawdę rzecz specyficzna dla kompilatora. W niektórych przypadkach kompilator może faktycznie zoptymalizować gałąź warunkową.
źródło
Scenariusz, w którym najczęściej go używam, dotyczy domyślnych wartości, a zwłaszcza zwrotów
To naprawdę jedyne miejsca, które uważam za miłe, ale dla nich tak.
Chociaż jeśli szukasz wartości logicznej, czasami może to wyglądać na właściwe:
Ponieważ jest tak łatwy do odczytania i zrozumienia, ale ten pomysł zawsze powinien być rzucany na rzecz bardziej oczywistych:
źródło
Jeśli potrzebujesz wielu oddziałów w tym samym stanie, użyj if:
Jeśli potrzebujesz wielu gałęzi z różnymi warunkami, to jeśli liczba instrukcji zmieni się w lawinę, będziesz chciał użyć trójskładnika:
Możesz także użyć operatora trójskładnikowego podczas inicjalizacji.
Robienie tego z if jest bardzo niechlujne:
Nie możesz umieścić inicjalizacji wewnątrz if / else, ponieważ zmienia to zakres. Ale odwołania i zmienne const mogą być powiązane tylko podczas inicjalizacji.
źródło
Operator trójskładnikowy może być zawarty w wartości r, podczas gdy jeśli-to-jeszcze nie może; z drugiej strony if-then-else może wykonywać pętle i inne instrukcje, podczas gdy operator trójskładnikowy może wykonywać tylko (prawdopodobnie void) wartości r.
W podobnej notatce && i || operatory zezwalają na niektóre wzorce wykonywania, które są trudniejsze do zaimplementowania za pomocą if-then-else. Na przykład, jeśli ktoś ma kilka funkcji do wywołania i chce wykonać fragment kodu, jeśli którakolwiek z nich zawiedzie, można to łatwo zrobić za pomocą operatora &&. Zrobienie tego bez tego operatora będzie wymagało nadmiarowego kodu, goto lub dodatkowej zmiennej flagowej.
źródło
W języku C # 7 możesz użyć nowej funkcji odwołań lokalnych, aby uprościć warunkowe przypisanie zmiennych zgodnych z ref. Więc teraz nie tylko możesz:
... ale także niezwykle cudowne:
Że linia kodu przypisuje wartość
a
do jednejb
lubc
, w zależności od wartościi
.Uwagi
1. r-wartość to prawa strona przypisania, wartość, która jest przypisywana.
2. Wartość-l to lewa strona przypisania, czyli zmienna, która otrzymuje przypisaną wartość.
źródło