Quels sont les avantages et les inconvénients de l'opérateur?: Par rapport à l'instruction if-else standard. Les plus évidents étant:
Conditionnel?: Opérateur
- Plus court et plus concis lorsqu'il s'agit de comparaisons et d'affectations directes de valeurs
- Ne semble pas aussi flexible que la construction if / else
Standard If / Else
- Peut être appliqué à plus de situations (comme les appels de fonction)
- Souvent inutilement longs
La lisibilité semble varier pour chacun en fonction de l'énoncé. Pendant un petit moment après avoir été exposé à l'opérateur?:, Il m'a fallu un certain temps pour comprendre exactement comment cela fonctionnait. Recommanderiez-vous de l'utiliser dans la mesure du possible, ou de m'en tenir à si / sinon étant donné que je travaille avec de nombreux non-programmeurs?
c#
conditional-operator
KChaloux
la source
la source
SomeCheck() ? DoFirstThing() : DoSecondThing();
vous devez utiliser l'expression pour renvoyer une valeur.Réponses:
Je recommanderais essentiellement de ne l'utiliser que lorsque l'instruction résultante est extrêmement courte et représente une augmentation significative de la concision par rapport à l'équivalent if / else sans sacrifier la lisibilité.
Bon exemple:
Mauvais exemple:
la source
return
faire partie du résultat de l'opération ternaire. Par exemple:check() ? return 1 : return 0;
ne fonctionnera pas, mais lereturn check() ? 1 : 0;
fera. Toujours amusant de trouver ces petites bizarreries dans la programmation.Ceci est à peu près couvert par les autres réponses, mais "c'est une expression" n'explique pas vraiment pourquoi c'est si utile ...
Dans des langages comme C ++ et C #, vous pouvez définir des champs en lecture seule locaux (dans un corps de méthode) en les utilisant. Cela n'est pas possible avec une instruction if / then conventionnelle car la valeur d'un champ en lecture seule doit être affectée dans cette instruction unique:
n'est pas la même chose que:
De la même manière, vous pouvez incorporer une expression tertiaire dans un autre code. En plus de rendre le code source plus compact (et dans certains cas plus lisible en conséquence), il peut également rendre le code machine généré plus compact et efficace:
... peut générer moins de code que d'avoir à appeler la même méthode deux fois:
Bien sûr, c'est aussi une forme plus pratique et concise (moins de frappe, moins de répétition et peut réduire le risque d'erreurs si vous devez dupliquer des morceaux de code dans un if / else). Dans des cas de "modèle commun" propres comme celui-ci:
... il est tout simplement plus rapide à lire / analyser / comprendre (une fois que vous y êtes habitué) que l'équivalent si / else long et long, donc il peut vous aider à «grok» le code plus rapidement.
Bien sûr, ce n'est pas parce que c'est utile que c'est la meilleure chose à utiliser dans tous les cas. Je conseillerais de ne l'utiliser que pour de courts morceaux de code où la signification est claire (ou rendue plus claire) en utilisant
?:
- si vous l'utilisez dans un code plus complexe, ou si vous imbriquez des opérateurs ternaires les uns dans les autres, cela peut rendre le code horriblement difficile à lire .la source
const
est constant, c'est-à-dire qu'il ne peut pas être modifié après l'exécution de l'instruction dans laquelle il est déclaré.readonly
? J'ai toujours pensé que celaconst
signifiait « résolu au moment de la compilation et intégré partout où il était utilisé ».Je choisis généralement un opérateur ternaire quand j'aurais beaucoup de code en double autrement.
Avec un opérateur ternaire, ceci pourrait être accompli avec ce qui suit.
la source
aVal = a > 0 ? a : -a; answer = compute(aVal,b,c,d,e);
Surtout sib
,c
,d
ete
aussi le traitement nécessaire.compute(...)
esta > 0 ? a : -1
, qui est évalué séparément des autres arguments séparés par des virgules. Quoi qu'il en soit, malheureusement, C ++ n'a pas la notation que votre question pose pour gérer les "tuples" de valeurs séparées par des virgules, donc mêmea > 0 ? (a, b, c, d, e) : (-a, b, c, d, e)
est illégal, et il n'y a rien de très similaire qui fonctionne sans changement decompute
lui-même.Je trouve cela particulièrement utile lors du développement Web si je souhaite définir une variable sur une valeur envoyée dans la demande si elle est définie ou sur une valeur par défaut si ce n'est pas le cas.
la source
Une utilisation vraiment cool est:
la source
foo
est faux, alors le tout sera évalué à 4 sans faire les autres tests.L'opérateur conditionnel est idéal pour les conditions courtes, comme ceci:
Je l'utilise occasionnellement car cela prend moins de temps pour écrire quelque chose de cette façon ... malheureusement, ce branchement peut parfois être manqué par un autre développeur parcourant votre code. De plus, le code n'est généralement pas aussi court, donc j'aide généralement la lisibilité en mettant le? et: sur des lignes séparées, comme ceci:
Cependant, le gros avantage de l'utilisation des blocs if / else (et pourquoi je les préfère) est qu'il est plus facile d'entrer plus tard et d'ajouter une logique supplémentaire à la branche,
ou ajoutez une autre condition:
Donc, en fin de compte, c'est une question de commodité pour vous maintenant (plus courte à utiliser:?) Vs de commodité pour vous (et les autres) plus tard. C'est un appel au jugement ... mais comme tous les autres problèmes de formatage de code, la seule vraie règle est d'être cohérent et d'être visuellement courtois avec ceux qui doivent maintenir (ou noter!) Votre code.
(tout le code est compilé à l'œil)
la source
Une chose à reconnaître lors de l'utilisation de l'opérateur ternaire qu'il s'agit d'une expression et non d'une instruction.
Dans les langages fonctionnels comme le schéma, la distinction n'existe pas:
(si (> ab) ab)
Conditionnel?: Opérateur "Ne semble pas aussi flexible que la construction if / else"
Dans les langages fonctionnels, c'est.
Lors de la programmation dans des langages impératifs, j'applique l'opérateur ternaire dans des situations où j'utiliserais généralement des expressions (affectation, instructions conditionnelles, etc.).
la source
Bien que les réponses ci-dessus soient valides et que je conviens que la lisibilité soit importante, il y a 2 autres points à considérer:
Cela rend particulièrement concis l'utilisation du ternaire:
Si vous avez des types
T1
etT2
que les deux peuvent être implicitement convertis enT
, alors ce qui suit ne fonctionne pas :(car le compilateur essaie de déterminer le type de l'expression ternaire et il n'y a pas de conversion entre
T1
etT2
.)En revanche, la
if/else
version ci-dessous fonctionne:car
T1
est converti enT
et est doncT2
la source
Parfois, cela peut rendre l'attribution d'une valeur booléenne plus facile à lire au premier coup d'œil:
la source
Si je mets une valeur et que je sais que ce sera toujours une ligne de code pour le faire, j'utilise généralement l'opérateur ternaire (conditionnel). S'il y a une chance que mon code et ma logique changent à l'avenir, j'utilise un if / else car c'est plus clair pour les autres programmeurs.
Un autre intérêt pour vous peut être le ?? opérateur .
la source
L'avantage de l'opérateur conditionnel est qu'il s'agit d'un opérateur. En d'autres termes, il renvoie une valeur. Puisqu'il
if
s'agit d'une instruction, elle ne peut pas renvoyer de valeur.la source
Je recommanderais de limiter l'utilisation de l'opérateur ternaire (? :) à une simple attribution d'une seule ligne logique if / else. Quelque chose ressemblant à ce modèle:
Peut être facilement converti en:
J'éviterais d'utiliser l'opérateur ternaire dans des situations qui nécessitent if / else if / else, imbriqué if / else, ou if / else une logique de branche qui aboutit à l'évaluation de plusieurs lignes. L'application de l'opérateur ternaire dans ces situations entraînerait probablement un code illisible, déroutant et ingérable. J'espère que cela t'aides.
la source
L'utilisation de l '? opérateur dans par exemple. MS Visual C ++, mais c'est vraiment une chose spécifique au compilateur. Le compilateur peut en fait optimiser la branche conditionnelle dans certains cas.
la source
Le scénario que je me retrouve le plus à utiliser est celui des valeurs par défaut et en particulier des retours
Ce sont vraiment les seuls endroits où je trouve ça sympa, mais pour eux je le fais.
Cependant, si vous recherchez un booléen, cela peut parfois sembler une chose appropriée à faire:
Parce que c'est si facile à lire et à comprendre, mais cette idée doit toujours être rejetée pour le plus évident:
la source
Si vous avez besoin de plusieurs succursales dans la même condition, utilisez un if:
Si vous avez besoin de plusieurs branches avec des conditions différentes, alors si le nombre d'instructions fait boule de neige, vous voudrez utiliser le ternaire:
Vous pouvez également utiliser l'opérateur ternaire lors de l'initialisation.
Faire cela avec if est très compliqué:
Vous ne pouvez pas placer l'initialisation dans if / else, car cela change la portée. Mais les références et les variables const ne peuvent être liées qu'à l'initialisation.
la source
L'opérateur ternaire peut être inclus dans une rvalue, alors qu'un if-then-else ne le peut pas; d'autre part, un if-then-else peut exécuter des boucles et d'autres instructions, tandis que l'opérateur ternaire ne peut exécuter que des rvalues (éventuellement vides).
Dans le même ordre d'idées, les && et || Les opérateurs autorisent certains modèles d'exécution qui sont plus difficiles à implémenter avec if-then-else. Par exemple, si l'on a plusieurs fonctions à appeler et que l'on souhaite exécuter un morceau de code si l'une d'entre elles échoue, cela peut être fait très bien en utilisant l'opérateur &&. Le faire sans cet opérateur nécessitera un code redondant, un goto ou une variable d'indicateur supplémentaire.
la source
Avec C # 7 , vous pouvez utiliser la nouvelle fonctionnalité de locals de référence pour simplifier l'affectation conditionnelle de variables compatibles ref. Alors maintenant, non seulement vous pouvez faire:
... mais aussi le plus merveilleux:
Cette ligne de code attribue la valeur de
a
à soitb
ouc
, en fonction de la valeur dei
.Notes
1. La valeur r est le côté droit d'une affectation, la valeur qui est affectée.
2. l-value est la gauche côté -hand d'une affectation, la variable qui reçoit la valeur assignée.
la source