1. Expressions vs Instructions
En C#, toutes les instructions se divisent en deux catégories : instructions (Statement) et expressions (Expression). D’habitude, on dit qu’une instruction s’exécute, alors qu’une expression se calcule. Mais c’est pas le plus important.
La vraie différence : une expression a un résultat de calcul. Ce résultat a un type, et tu peux l’assigner à une variable ou l’utiliser dans une autre expression.
Exemples :
| Code | Remarques |
|---|---|
|
Instruction |
|
Expression, type bool |
|
Expression, type identique à la variable i |
|
Expression, type identique à la variable x |
Qu’est-ce que ça nous apporte ?
Beaucoup d’instructions sont en fait des expressions (elles ont un résultat de calcul). Par exemple, ce code fonctionne :int x, y, z;
x = y = z = 1; // x = (y = (z = 1));
Tu peux ignorer le résultat d’une expression si t’en as pas besoin :
Console.ReadLine(); // on ignore le résultat de la saisie
C’est pratique si l’expression fait autre chose d’utile en plus de renvoyer un résultat (genre afficher à l’écran ou lire une entrée).
2. L’opérateur ternaire
En C#, il y a un opérateur ternaire (ou triple) spécial. Il ressemble à une version raccourcie de if–else :
Condition ? Expression1 : Expression2;
Si Condition est vraie, Expression1 est calculée, sinon — Expression2. Après la condition, on met ?, et les deux expressions sont séparées par :.
La grosse différence avec if-else : l’opérateur ternaire est une expression, tu peux donc assigner son résultat à une variable ou l’utiliser ailleurs.
Par exemple, calculons le minimum de deux nombres :
int a = 2;
int b = 3;
int min = a < b ? a : b;
Ou assigner à une variable différentes valeurs selon la condition :
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
Pareil avec l’opérateur ternaire :
int age = 25;
int money = age > 30 ? 100 : 50;
Quoi utiliser : if-else ou l’opérateur ternaire ? Niveau perf, c’est pareil, mais le ternaire est top pour les conditions courtes. Si ça tient pas sur une ligne — mieux vaut un if-else pour la lisibilité.
3. Subtilités d’utilisation
Types des valeurs
Les deux branches de l’opérateur ternaire (<valeur_si_vrai> et <valeur_si_faux>) doivent être du même type ou compatibles (genre deux string ou deux int).
Ça marche :
int a = 10, b = 20;
int max = (a > b) ? a : b; // les deux branches — int
Erreur de compilation :
int a = 10, b = 20;
// string et int sont incompatibles
string result = (a > b) ? "plus grand" : 0; // Erreur de compilation
Version correcte :
int a = 10, b = 20;
string result = (a > b) ? "plus grand" : "plus petit ou égal";
Exemple : manipuler des nombres
int number = -5;
int abs = (number >= 0) ? number : -number;
Console.WriteLine(abs); // 5
4. Intégrer l’opérateur ternaire dans une appli
Écrivons une petite appli de dialogue : en plus du message de bienvenue, le programme dira à l’utilisateur quel âge il aura l’an prochain, et s’il sera majeur ou pas.
Console.Write("Tape ton nom : ");
string name = Console.ReadLine();
Console.Write("Tape ton âge : ");
string ageText = Console.ReadLine();
int age = int.Parse(ageText);
int nextYear = age + 1;
string status = (nextYear >= 18) ? "majeur" : "mineur";
Console.WriteLine($"Salut, {name} ! L’an prochain tu auras {nextYear} ans. Tu seras {status}.");
Explications :
- La variable status est calculée via l’opérateur ternaire : si l’âge dans un an est au moins 18, l’utilisateur sera majeur (ou le restera).
- L’opérateur ternaire s’intègre facilement dans les chaînes (par exemple avec l’interpolation $"").
5. Ternaires imbriqués — attention !
On peut imbriquer des opérateurs ternaires (dans chaque branche, il peut y avoir un autre ternaire). Mais… ça fait vite mal à la tête, surtout pour celui qui relira le code après toi (même si c’est toi dans 2 jours).
Exemple : déterminer la catégorie selon l’âge
string category = (age < 7) ? "pré-scolaire" :
(age < 18) ? "scolaire" :
(age < 65) ? "adulte" : "retraité";
Tableau de décision :
| Âge | Condition | Résultat |
|---|---|---|
| < 7 | age < 7 | pré-scolaire |
| 7–17 | age < 18 | scolaire |
| 18–64 | age < 65 | adulte |
| 65 et plus | sinon | retraité |
Ce code reste lisible, mais si la logique devient plus complexe — mieux vaut utiliser if-else if-else.
6. Astuce : opérateur ternaire et type bool
Parfois, on voit ce genre de code :
bool adulte = (age >= 18) ? true : false;
Mais c’est inutile. L’expression (age >= 18) renvoie déjà un bool. Donc tu peux juste écrire :
bool adulte = (age >= 18);
GO TO FULL VERSION