Was sind die Vor- und Nachteile des ?: Operators im Gegensatz zur Standard-if-else-Anweisung. Die offensichtlichen sind:
Bedingt?: Operator
- Kürzer und prägnanter beim Umgang mit direkten Wertevergleichen und Zuordnungen
- Scheint nicht so flexibel zu sein wie das if / else-Konstrukt
Standard If / Else
- Kann auf mehrere Situationen angewendet werden (z. B. Funktionsaufrufe)
- Oft sind sie unnötig lang
Die Lesbarkeit scheint je nach Aussage unterschiedlich zu sein. Nachdem ich dem Operator ?: Zum ersten Mal ausgesetzt war, brauchte ich eine Weile, um genau zu verstehen, wie es funktionierte. Würden Sie empfehlen, es wo immer möglich zu verwenden oder sich daran zu halten, wenn ich mit vielen Nicht-Programmierern zusammenarbeite?
c#
conditional-operator
KChaloux
quelle
quelle
SomeCheck() ? DoFirstThing() : DoSecondThing();
- Sie müssen den Ausdruck verwenden, um einen Wert zurückzugeben.Antworten:
Ich würde grundsätzlich empfehlen, es nur zu verwenden, wenn die resultierende Aussage extrem kurz ist und eine signifikante Erhöhung der Prägnanz gegenüber dem if / else-Äquivalent darstellt, ohne die Lesbarkeit zu beeinträchtigen.
Gutes Beispiel:
Schlechtes Beispiel:
quelle
return
Teil des Ergebnisses der ternären Operation sein können. Zum Beispiel:check() ? return 1 : return 0;
wird nicht funktionieren, wird aberreturn check() ? 1 : 0;
. Es macht immer Spaß, diese kleinen Macken in der Programmierung zu finden.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:
ist nicht dasselbe wie:
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:
... kann weniger Code generieren, als dieselbe Methode zweimal aufrufen zu müssen:
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:
... 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 .quelle
const
anders ausgedrückt, a ist konstant, dh es kann nicht geändert werden, nachdem die Anweisung, in der es deklariert ist, ausgeführt wurde.readonly
? Ich dachte immerconst
" zur Kompilierungszeit gelöst und überall dort eingebunden, wo es verwendet wird ".Normalerweise wähle ich einen ternären Operator, wenn ich sonst viel doppelten Code hätte.
Mit einem ternären Operator könnte dies wie folgt erreicht werden.
quelle
aVal = a > 0 ? a : -a; answer = compute(aVal,b,c,d,e);
Vor allem , wennb
,c
,d
unde
Behandlung auch erforderlich.compute(...)
ista > 0 ? a : -1
, das alle getrennt von den anderen durch Kommas getrennten Argumenten ausgewertet wird. Leider fehlt C ++ die Notation, die Ihre Frage für den Umgang mit "Tupeln" von durch Kommas getrennten Werten enthält. Dies ist sogara > 0 ? (a, b, c, d, e) : (-a, b, c, d, e)
illegal, und es gibt nichts sehr Ähnliches, das ohne Änderungen an sichcompute
selbst funktioniert .Ich finde es besonders hilfreich bei der Webentwicklung, wenn ich eine Variable auf einen Wert setzen möchte, der in der Anforderung gesendet wird, wenn sie definiert ist, oder auf einen Standardwert, wenn dies nicht der Fall ist.
quelle
Eine wirklich coole Verwendung ist:
quelle
foo
falsch ist, wird das Ganze im Wesentlichen mit 4 bewertet, ohne die anderen Tests durchzuführen.Der bedingte Operator eignet sich hervorragend für kurze Bedingungen wie diese:
Ich benutze es gelegentlich, weil es weniger Zeit braucht, etwas auf diese Weise zu schreiben ... Leider kann diese Verzweigung manchmal von einem anderen Entwickler übersehen werden, der Ihren Code durchsucht. Außerdem ist der Code normalerweise nicht so kurz, sodass ich normalerweise die Lesbarkeit unterstütze, indem ich das? und: in separaten Zeilen wie folgt:
Der große Vorteil bei der Verwendung von if / else-Blöcken (und warum ich sie bevorzuge) ist jedoch, dass es einfacher ist, später einzutreten und dem Zweig zusätzliche Logik hinzuzufügen.
oder fügen Sie eine andere Bedingung hinzu:
Letztendlich geht es also um Bequemlichkeit für Sie (kürzer zu verwenden :?) Im Vergleich zu Bequemlichkeit für Sie (und andere) später. Es ist ein Urteilsspruch ... aber wie bei allen anderen Problemen bei der Code-Formatierung besteht die einzige wirkliche Regel darin, konsistent und visuell höflich gegenüber denen zu sein, die Ihren Code pflegen (oder bewerten!) Müssen.
(alle Code Auge kompiliert)
quelle
Bei der Verwendung des ternären Operators ist zu beachten, dass es sich um einen Ausdruck und nicht um eine Anweisung handelt.
In funktionalen Sprachen wie Schema existiert die Unterscheidung nicht:
(if (> ab) ab)
Bedingt ?: Operator "Scheint nicht so flexibel zu sein wie das if / else-Konstrukt"
In funktionalen Sprachen ist es.
Beim Programmieren in imperativen Sprachen wende ich den ternären Operator in Situationen an, in denen ich normalerweise Ausdrücke (Zuweisung, bedingte Anweisungen usw.) verwenden würde.
quelle
Obwohl die obigen Antworten gültig sind und ich der Lesbarkeit zustimme, sind zwei weitere Punkte zu beachten:
Dies macht es besonders prägnant, das ternäre zu verwenden:
Wenn Sie Typen haben
T1
undT2
dass beide implizit konvertiert werden könnenT
, dann ist die unten tut nicht Arbeit:(weil der Compiler versucht, den Typ des ternären Ausdrucks zu bestimmen, und es keine Konvertierung zwischen
T1
und gibtT2
.)Auf der anderen Seite
if/else
funktioniert die folgende Version:weil
T1
konvertiert wirdT
und so istT2
quelle
Manchmal kann es die Zuweisung eines Bool-Werts auf den ersten Blick leichter lesbar machen:
quelle
Wenn ich einen Wert einstelle und weiß, dass dies immer eine Codezeile ist, verwende ich normalerweise den ternären (bedingten) Operator. Wenn sich mein Code und meine Logik in Zukunft möglicherweise ändern, verwende ich ein if / else, da dies für andere Programmierer klarer ist.
Von weiterem Interesse für Sie kann die ?? Betreiber .
quelle
Der Vorteil des bedingten Operators besteht darin, dass er ein Operator ist. Mit anderen Worten, es wird ein Wert zurückgegeben. Da
if
es sich um eine Anweisung handelt, kann sie keinen Wert zurückgeben.quelle
Ich würde empfehlen, die Verwendung des ternären (? :) Operators auf die einfache Zuweisung einer einzelnen Zeile zu beschränken, wenn / sonst Logik. Etwas ähnlich diesem Muster:
Könnte leicht konvertiert werden zu:
Ich würde es vermeiden, den ternären Operator in Situationen zu verwenden, in denen if / else if / else, verschachtelte if / else oder if / else-Verzweigungslogik erforderlich sind, die zur Auswertung mehrerer Zeilen führt. Das Anwenden des ternären Operators in diesen Situationen würde wahrscheinlich zu unlesbarem, verwirrendem und nicht verwaltbarem Code führen. Hoffe das hilft.
quelle
Es gibt einige Leistungsvorteile bei der Verwendung des? Betreiber in z. MS Visual C ++, aber dies ist wirklich eine compilerspezifische Sache. In einigen Fällen kann der Compiler den bedingten Zweig tatsächlich optimieren.
quelle
Das Szenario, in dem ich es am häufigsten verwende, betrifft Standardwerte und insbesondere Rückgaben
Das sind wirklich die einzigen Orte, an denen ich es schön finde, aber für sie tue ich es.
Wenn Sie nach einem Booleschen Wert suchen, scheint dies manchmal eine angemessene Vorgehensweise zu sein:
Weil es so einfach zu lesen und zu verstehen ist, aber diese Idee sollte immer für das Offensichtliche geworfen werden:
quelle
Wenn Sie mehrere Zweige unter derselben Bedingung benötigen, verwenden Sie ein if:
Wenn Sie mehrere Zweige mit unterschiedlichen Bedingungen benötigen und die Anzahl der Anweisungen Schneeball schlagen würde, sollten Sie das ternäre verwenden:
Sie können auch den ternären Operator bei der Initialisierung verwenden.
Das zu tun mit if ist sehr chaotisch:
Sie können die Initialisierung nicht in if / else einfügen, da dies den Bereich ändert. Referenzen und const-Variablen können jedoch nur bei der Initialisierung gebunden werden.
quelle
Der ternäre Operator kann in einen r-Wert aufgenommen werden, ein Wenn-Dann-Sonst nicht. Andererseits kann ein Wenn-Dann-Sonst Schleifen und andere Anweisungen ausführen, während der ternäre Operator nur (möglicherweise ungültige) r-Werte ausführen kann.
In einem verwandten Hinweis sind die && und || Operatoren erlauben einige Ausführungsmuster, die mit if-then-else schwieriger zu implementieren sind. Wenn Sie beispielsweise mehrere Funktionen aufrufen müssen und einen Code ausführen möchten, wenn eine davon fehlschlägt, können Sie dies mit dem Operator && tun. Wenn Sie auf diesen Operator verzichten, ist entweder redundanter Code, ein goto oder eine zusätzliche Flag-Variable erforderlich.
quelle
Mit C # 7 können Sie die neue Ref-Locals- Funktion verwenden, um die bedingte Zuweisung von Ref-kompatiblen Variablen zu vereinfachen. Jetzt können Sie also nicht nur Folgendes tun:
... aber auch das extrem wundervolle:
Diese Codezeile weist den Wert von
a
entwederb
oder zuc
, abhängig vom Wert voni
.Anmerkungen
1. Der r-Wert ist die rechte Seite einer Zuweisung, der Wert, der zugewiesen wird.
2. l-Wert ist die linke Seite einer Zuweisung, die Variable, die den zugewiesenen Wert erhält.
quelle