Une instruction if n'exécute un bloc de code que lorsqu'une condition est vraie. else if ajoute d'autres tests, et else attrape tout ce que les tests n'ont pas couvert.
Sortie :
Order 120: shipping 0
Order 75.50: shipping 4.99
Order 20: shipping 9.99
Les conditions sont vérifiées de haut en bas et la première vraie l'emporte. Une commande de 120 correspond à >= 100 et n'atteint jamais le test >= 50, c'est pourquoi la condition la plus spécifique vient en premier. else if n'est pas un mot-clé distinct : c'est un else dont le corps est un autre if, il n'y a donc ni elseif ni elif en C#.
Les conditions doivent être des bool
C# ne traite jamais un nombre, une chaîne ou un objet comme vrai ou faux. L'expression entre parenthèses doit être de type bool :
int count = 3;
if (count) // error CS0029: Cannot implicitly convert type 'int' to 'bool'
if (count > 0) // correct
if (name) // error: a string is not a bool either
if (name != null) // correct
Cela supprime toute une famille de bugs de C et JavaScript, où 0, "" et null comptent silencieusement comme faux. Le prix à payer est d'écrire la comparaison à chaque fois, ce qui rend aussi l'intention visible pour le lecteur suivant.
Combiner des conditions avec &&, || et !
&& (et), || (ou) et ! (non) combinent des tests booléens. && et || court-circuitent : la partie droite ne s'exécute que si la partie gauche n'a pas déjà décidé du résultat.
Sortie :
maya: welcome
invalid or banned account
invalid or banned account
omar: age 9 rejected
invalid or banned account
L'appel avec null est sûr grâce au court-circuit : dès que username != null est faux, username.Length n'est jamais évalué, donc pas de NullReferenceException. Inversez l'ordre en username.Length >= 3 && username != null et le même appel plante.
&& lie plus fortement que ||, donc a || b && c signifie a || (b && c). Ajoutez des parenthèses dès que vous mélangez les deux ; le compilateur n'en a pas besoin, mais les lecteurs si. Les opérateurs à un caractère & et | fonctionnent aussi sur bool, mais ils évaluent toujours les deux côtés. Ne les utilisez que lorsque la partie droite a un effet de bord qui doit se produire.
Les accolades et la règle de l'instruction unique
Les accolades sont facultatives quand une branche contient une seule instruction. Sans elles, seule l'instruction suivante appartient au if, quoi qu'en dise l'indentation :
Sortie :
Reorder email sent
Stock: 12
« Reorder email sent » s'affiche alors que le stock est suffisant : le second WriteLine est en dehors du if, malgré l'indentation. Une garde sur une ligne comme if (x == null) return; convient sans accolades ; tout ce qui pourrait gagner une seconde ligne devrait en avoir.
Un bug voisin est un point-virgule juste après la condition. if (stock < 5); termine le if par une instruction vide, et le bloc qui suit s'exécute sans condition. Le compilateur le signale par l'avertissement CS0642, Possible mistaken empty statement, qu'il vaut la peine de traiter comme une erreur.
= ou == dans une condition
= affecte, == compare. Pour la plupart des types, écrire = par erreur ne compile pas, car le résultat d'une affectation est la valeur affectée et un int n'est pas un bool :
int score = 10;
if (score = 100) { } // error CS0029: Cannot implicitly convert type 'int' to 'bool'
Avec une variable bool, l'affectation est elle-même un bool, donc la faute de frappe compile :
Sortie :
Access granted
isAdmin is now True
La condition a écrasé isAdmin puis testé la nouvelle valeur. Le compilateur émet un avertissement (CS0665, assignment in a conditional expression is always constant), mais la compilation réussit quand même. Pour les bool, passez-vous complètement de la comparaison : if (isAdmin) et if (!isAdmin) se lisent mieux et ne peuvent pas être mal tapés de cette façon.
if imbriqués ou clauses de garde
Chaque niveau d'imbrication est une condition de plus que le lecteur doit garder en tête. Quand chaque vérification rejette une entrée invalide, sortez tôt au lieu d'imbriquer le cas normal dans toutes ces vérifications :
Sortie :
ordered 2 x keyboard
error: no product
error: quantity must be positive
error: insufficient balance
La version imbriquée de la même méthode aurait trois niveaux de if, avec le vrai travail dans le bloc le plus interne et trois branches else qui se dénouent en bas. Avec des clauses de garde, chaque règle se trouve à côté de son message d'erreur et la dernière ligne est le cas normal. La même idée fonctionne dans les boucles avec continue.
Déclarer des variables dans la condition
Une condition peut déclarer une variable visible à l'intérieur du if. Les deux formes courantes sont un out var provenant d'une méthode TryParse et le pattern de type is :
Sortie :
42: positive number 42
abc: not a number
-7: number -7, not positive
string of length 5
TryParse renvoie false au lieu de lever une exception sur une entrée invalide, ce qui en fait le partenaire naturel d'un if. La page sur la conversion de types détaille les méthodes d'analyse.
Quand utiliser autre chose
- Choisir l'une de deux valeurs : l'opérateur conditionnel
condition ? a : best plus court qu'unifqui affecte dans les deux branches. - Beaucoup de branches sur une seule valeur : une instruction
switchcompare une valeur à des cas constants et se parcourt plus facilement que dix ligneselse if. - Associer une valeur à un résultat : une recherche dans un
Dictionaryremplace une longue chaîne quand les branches ne diffèrent que par des données.
Questions fréquentes
Comment écrire else if en C# ?
Écrivez else if en deux mots : if (a) { ... } else if (b) { ... } else { ... }. Les conditions sont testées de haut en bas et seule la première branche vraie s'exécute, donc placez le test le plus spécifique en premier. Il n'existe pas de mot-clé elif ou elseif.
Pourquoi ne peut-on pas écrire if (count) en C# ?
Une condition C# doit être de type bool. Contrairement à C et JavaScript, un int, une chaîne ou un objet n'est jamais converti en vrai ou faux, donc if (count) échoue avec CS0029, Cannot implicitly convert type 'int' to 'bool'. Écrivez le test que vous voulez dire : if (count > 0) ou if (name != null).
Quelle est la différence entre && et & dans une condition if ?
&& court-circuite : si la partie gauche est fausse, la partie droite n'est jamais évaluée, ce qui rend s != null && s.Length > 0 sûr. & sur deux bool évalue les deux côtés à chaque fois. Il en va de même pour || et |. Utilisez && et || dans les conditions, sauf si vous avez besoin de l'effet de bord de la partie droite.
Les accolades sont-elles obligatoires dans un if en C# ?
Non. Sans accolades, le if contrôle exactement une instruction. Indenter une seconde ligne ne l'ajoute pas à la branche, ce qui est une source classique de bugs ; la plupart des guides de style recommandent donc des accolades sur chaque branche.
Peut-on écrire un if else sur une seule ligne en C# ?
Pour choisir une valeur, utilisez l'opérateur conditionnel : string label = score >= 50 ? "pass" : "fail";. Pour exécuter des instructions, if (x) DoA(); else DoB(); est légal sur une ligne, mais c'est plus difficile à lire et à étendre qu'un bloc avec accolades.