C'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 locaux en lecture seule (dans le corps d'une méthode) en les utilisant. Cela n'est pas possible avec une instruction if/then classique, car la valeur d'un champ en lecture seule doit être affectée dans cette seule instruction :
readonly int speed = (shiftKeyDown) ? 10 : 1;
n'est pas la même chose que :
readonly int speed;
if (shifKeyDown)
speed = 10; // error - can't assign to a readonly
else
speed = 1; // error
De la même manière, vous pouvez intégrer une expression tertiaire dans un autre code. En plus de rendre le code source plus compact (et dans certains cas plus lisible), cela peut également rendre le code machine généré plus compact et plus efficace :
MoveCar((shiftKeyDown) ? 10 : 1);
...peut générer moins de code que de devoir appeler deux fois la même méthode :
if (shiftKeyDown)
MoveCar(10);
else
MoveCar(1);
Bien entendu, il s'agit également d'une forme plus pratique et plus concise (moins de saisie, moins de répétitions, et peut réduire les risques d'erreurs si vous devez dupliquer des morceaux de code dans un if/else). Dans les cas de "modèles communs" propres comme celui-ci :
object thing = (reference == null) ? null : reference.Thing;
... il est tout simplement plus rapide à lire/analyser/comprendre (une fois que l'on y est habitué) que le long et fastidieux équivalent if/else, et peut donc vous aider à "appréhender" le code plus rapidement.
Bien sûr, ce n'est pas parce que c'est utile ne signifie pas que c'est la meilleure chose à faire utiliser dans tous les cas. Je conseillerais de ne l'utiliser que pour de courts bouts de code dont la signification est claire (ou rendue plus claire) par l'utilisation de ?:
- 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.
8 votes
Vous avez déjà compris l'essentiel.
0 votes
Je n'ai fait que peu de choses en C#, mais la plupart des langages autorisent les appels de fonction à l'intérieur de l'opérateur conditionnel. Le C# ne le permet-il vraiment pas ? Cela semble très étrange...
1 votes
@Nicholas Knight : Je suppose que le PO veut dire que vous ne pouvez pas faire, par exemple,
SomeCheck() ? DoFirstThing() : DoSecondThing();
-- vous devez utiliser l'expression pour retourner une valeur.6 votes
Utilisez-le où il est clair Dans le cas contraire, restez-en à if/else. La clarté du code doit être votre principale préoccupation.
8 votes
T'as déjà vu le " ??"? Sérieusement, si tu penses que les ternaires sont cool...
0 votes
Question similaire concernant la différence de vitesse entre les deux stackoverflow.com/questions/2586842/ (C'est négligeable).
0 votes
@pdr, avez-vous un lien ? Je ne peux pas le googler....
0 votes
@Gordon : En fait, j'ai été curieux à ce sujet hier et j'ai exécuté deux boucles qui ont comparé 2^16 entiers générés aléatoirement avec if/else et ? :. Je suis arrivé à la même conclusion : cela ne fait pas une différence notable sur les performances.
3 votes
+1 pour ne pas l'appeler simplement "l'opérateur ternaire" comme beaucoup le font. Même si c'est le seul opérateur ternaire (par opposition à unaire et binaire) en C#, ce n'est pas son nom.
0 votes
@Byron, voir : msdn.microsoft.com/fr/us/library/ms173224(VS.90).aspx
??
est essentiellement un opérateur "par défaut s'il est nul", ou techniquement un opérateur "coalescent nul".