Section courante

A propos

Section administrative du site

 Langage  Installation  Elément  Tutoriel  Programmation  Bibliothèque  Cadre d'application  SDK  Gabarit  Projet  IDE  Outils  Annexe  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
Rust
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Visual C# 2005 Express
Visual Studio .NET 2003
Visual Studio 2005
Visual Studio 2008
Visual Studio 2010
Visual Studio 2012
Visual Studio 2013
Visual Studio 2015
Visual Studio 2017
Visual Studio 2019
Introduction
Les remarques
Les opérateurs
Les instructions conditionnelles
Les instructions de boucles
Les instructions d'exceptions
Type de données élémentaires
Définition de variables
Définitions de tableaux
Requêtes de données (LINQ)
Référence des mots réservés
Référence des espaces de nom (Namespace)
Les classes
Références des classes
Directives de préprocesseur C#
Les nombres
Les chaines de caractères
Date et heure
Vue par catégorie
Les interfaces
Les classes abstraites
Les classes scellés
Les indexeurs
Les premiers pas
Les fondements de C#
Les types primitifs et variables
Les opérateurs et les expressions
Les entrées/sorties de la console
Les déclarations conditionnelles
Les déclarations de boucles
Les systèmes numériques
Traitement des chaînes de caractères et du texte
WinForms (Windows Forms)
Les opérations
Conversion de string à int
Bonjour
Astronomie
Base de données
Biochimie
Chaine de caractères
Electricité
Finance
Géographie
Géométrie
Gouvernement
Histoire
Mathématique
Médicale
Météorologie
Océanographie
Sport
Système d'exploitation
Temps
Tri
Trigonométrie
Validation
Phase lunaire
Table SQL Server
Calcul du calcium corrigé
Calcul le taux d'alcoolémie
Nombre réel avec un certain nombre de décimal
Majuscule (strtoupper ou UpperCase)
Minuscule (strtolower ou LowerCase)
Calcul du tarif d'une piscine pour 1 mois
IPaymt/Interet
NPer
PPaymt/Principal
Distance en Km entre deux longitudes et latitudes
Aire d'un cercle
Aire d'une surface de prisme rectangulaire
Aire d'un triangle
Distance entre deux points
Taxe de vente canadienne
Chiffre romain
Ackermann
Exp
Factoriel
Fibonacci
Log
Nombre premier
Odd
Random
Sqrt
Triangle Pascal
Valeur absolue (ABS)
Hauteur utérine
Unité de mesure
Fréquence des vagues
Hockey
Variables d'environnement
Année bissextile
Date de la Pâque
Heure courante
FirstDayOfMonth
Tri à bulle (Bubble Sort)
Tri Shell Sort
ArcCos
ArcSin
Atn/ATan/ArcTan/ArcTangente
Cos
Sin
Courriel
ALGLIB
Dapper
ElmahCore
FluentFTP
log4net
MailKit
MediatR
MimeKit
Newtonsoft.Json (Json.NET)
Serilog
.NET
.NET Core
.NET Framework
Accord.NET Framework
Akka.NET
ASP.NET
ASP.NET Core
Avalonia UI
Blazor
Entity Framework
Entity Framework Core (EF Core)
Hangfire
Infer.NET
MAUI
ML.NET
Mono
NHibernate
NUnit
Unity
xUnit.net
Azure SDK for .NET
AWS SDK for .NET
Bot Framework SDK
Razor
Umbraco
Rider
Visual Studio
Visual Studio Code
Visual C# 2005 Express
Xamarin Studio
Visual Studio .NET
Visual Studio .NET 2003
Visual Studio 2005
Visual Studio 2008
Visual Studio 2010
Visual Studio 2012
Visual Studio 2013
Visual Studio 2015
Visual Studio 2017
Visual Studio 2019
Visual Studio 2022
ELMAH
elmah.io
MS Build Tools
NuGet
WiX Toolset
Add-in Express
csc (C# Compiler)
CFF Explorer
IL DASM
ILMerge
.NET Reflector
Salamander .NET Decompiler
Références des codes d'erreur du C# (C Sharp)
Base de connaissances
Conventions de nommage
Vocabulaire
Marqueurs
Archives de paquet externe
Bibliographie
Préface
Notes légal
Dictionnaire
Recherche

Les déclarations conditionnelles

Dans cette page, nous aborderons les instructions conditionnelles en C#, que nous pouvons utiliser pour exécuter différentes actions en fonction d'une condition donnée. Nous expliquerons la syntaxe des opérateurs conditionnels if et if-else avec des exemples appropriés et expliquerons l'application pratique de l'opérateur de sélection switch-case.

Nous nous concentrerons sur les meilleures pratiques à suivre afin d'obtenir un meilleur style de programmation lors de l'utilisation d'instructions conditionnelles imbriquées ou d'autres types d'instructions conditionnelles.

Opérateurs de comparaison et expressions booléennes

Dans la section suivante, nous allons rappeler les opérateurs de comparaison de base du langage de programmation C#. Ils sont importants, car nous les utilisons pour décrire les conditions dans nos instructions conditionnelles.

Opérateurs de comparaison

Il existe plusieurs opérateurs de comparaison en C#, étant utilisés pour comparer des paires d'entiers, de nombres à virgule flottante, de caractères, de chaînes et d'autres types :

Opérateur Action
== Égal à
!= Pas égal à
> Supérieur à
>= Supérieur ou égal à
< Inférieur à
<= Inférieur ou égal à

Les opérateurs de comparaison peuvent être utilisés pour comparer des expressions telles que deux nombres, deux expressions numériques ou un nombre et une variable. Le résultat de la comparaison est une valeur booléenne (vrai ou faux).

Voyons un exemple d'utilisation des comparaisons :

  1. int Poids = 777;
  2. Console.WriteLine(Poids >= 500); // True
  3. char Genre = 'M';
  4. Console.WriteLine(Genre <= 'F'); // False
  5. double LongueurOndedeCouleur = 1.630;
  6. Console.WriteLine(LongueurOndedeCouleur > 1.621); // True
  7. int a = 5;
  8. int b = 7;
  9. bool condition = (b > a) && (a + b < a * b);
  10. Console.WriteLine(condition); // True
  11. Console.WriteLine('B' == 'A' + 1); // True

Dans l'exemple de code, nous effectuons une comparaison entre des nombres et entre des caractères. Les nombres sont comparés par taille tandis que les caractères sont comparés par ordre lexicographique (l'opération utilise les nombres Unicode pour les caractères correspondants).

Comme on le voit dans l'exemple, le type de données char se comporte comme un nombre et peut être soustrait, ajouté et comparé à des nombres librement. Cependant, cela doit être utilisé avec prudence car cela pourrait rendre le code difficile à lire et à comprendre. En exécutant l'exemple, nous produirons la sortie suivante :

True
False
True
True
True

En C#, plusieurs types de données peuvent être comparés :

Chaque comparaison peut concerner deux nombres, deux valeurs booléennes ou deux références d'objet. Il est permis de comparer des expressions de types différents, comme un entier avec un nombre à virgule flottante par exemple. Cependant, toutes les paires de types de données ne peuvent pas être comparées directement. Par exemple, nous ne pouvons pas comparer une chaîne de caractères avec un nombre.

Comparaison d'entiers et de caractères

Lorsque l'on compare des entiers et des caractères, on compare directement leur représentation binaire en mémoire, c'est-à-dire que l'on compare leurs valeurs. Par exemple, si l'on compare deux nombres de type int, on comparera les valeurs de leurs séries respectives de 4 octets. Voici un exemple de comparaison d'entiers et de caractères :

  1. Console.WriteLine("char 'a' == 'a'? " + ('a' == 'a')); // True
  2. Console.WriteLine("char 'a' == 'b'? " + ('a' == 'b')); // False
  3. Console.WriteLine("4 != 7? " + (4 != 7)); // True
  4. Console.WriteLine("3.0 == 3L? " + (3.0 == 3L)); // True
  5. Console.WriteLine("true == false? " + (true == false)); // False

Le résultat de l'exemple est le suivant :

char 'a' == 'a'? True
char 'a' == 'b'? False
4 != 7? True
3.0 == 3L? True
true == false? False

Comparaison des références aux objets

Dans .NET Framework, il existe des types de données de référence ne contenant pas leur valeur (contrairement aux types de valeur), mais contiennent l'adresse de la mémoire dans la mémoire de tas où se trouve leur valeur. Les chaînes de caractères, les tableaux et les classes sont de tels types. Ils se comportent comme un pointeur vers une valeur et peuvent avoir la valeur null, c'est-à-dire aucune valeur. Lorsque nous comparons des variables de type référence, nous comparons les adresses qu'elles contiennent, c'est-à-dire que nous vérifions si elles pointent vers le même emplacement dans la mémoire, c'est-à-dire vers le même objet.

Deux pointeurs d'objet (références) peuvent faire référence au même objet ou à des objets différents, ou l'un d'eux peut pointer vers nulle part (avoir une valeur nulle). Dans l'exemple suivant, nous créons deux variables pointant vers la même valeur (objet) dans la mémoire de tas :

  1. string chaine = "café";
  2. string autreChaine = chaine;

Après avoir exécuté le code source ci-dessus, les deux variables chaine et autreChaine pointeront vers le même objet (chaîne de caractères avec la valeur "café"), se trouvant à une certaine adresse dans la mémoire de tas (mémoire de tas géré).

Nous pouvons vérifier si les variables pointent vers le même objet avec l'opérateur de comparaison (==). Pour la plupart des types de référence, cet opérateur ne compare pas le contenu des objets mais vérifie plutôt s'ils pointent vers le même emplacement en mémoire, c'est-à-dire s'il s'agit d'un seul et même objet. Les comparaisons de taille (<, >, <= et >=) ne sont pas applicables aux variables de type objet.

L'exemple suivant illustre la comparaison de références à des objets :

  1. string chaine = "café";
  2. string autreChaine = chaine;
  3. string troisiemeChaine = "caf";
  4. troisiemeChaine = troisiemeChaine + 'é';
  5. Console.WriteLine("chaine = {0}", chaine);
  6. Console.WriteLine("autreChaine = {0}", autreChaine);
  7. Console.WriteLine("troisiemeChaine = {0}", troisiemeChaine);
  8. Console.WriteLine(chaine == autreChaine); // True - même objet
  9. Console.WriteLine(chaine == troisiemeChaine); // True - objets égaux
  10. Console.WriteLine((object)chaine == (object)autreChaine); // True
  11. Console.WriteLine((object)chaine == (object)troisiemeChaine); // False

Si nous exécutons l'exemple de code, nous obtiendrons le résultat suivant :

chaine = café
autreChaine = café
troisiemeChaine = café
True
True
True
False

Comme les chaînes de caractères utilisées dans l'exemple (instances de la classe System.String, définie par le mot-clef string en C#) sont de type référence, leurs valeurs sont définies comme des objets dans la mémoire de tas. Les deux objets chaine et troisiemeChaine ont des valeurs égales, mais sont des objets différents, situés à des adresses distinctes dans la mémoire. La variable autreChaine est également de type référence et obtient l'adresse (la référence) de chaine, c'est-à-dire pointe vers l'objet existant chaine. Ainsi, par la comparaison des variables chaine et troisiemeChaine, il apparaît qu'elles sont un seul et même objet et qu'elles sont égales. Le résultat de la comparaison entre chaine et troisiemeChaine est également l'égalité, car l'opérateur == compare les chaînes par valeur et non par adresse (une exception très utile à la règle de comparaison par adresse). Cependant, si nous convertissons les trois variables en objets et que nous les comparons ensuite, nous obtiendrons une comparaison des adresses dans le tas où se trouvent leurs valeurs et le résultat sera différent.

L'exemple ci-dessus montre que l'opérateur == a un comportement spécial lors de la comparaison de chaînes de caractères, mais pour le reste des types de référence (comme les tableaux ou les classes), il applique la comparaison par adresse.

Opérateurs logiques

Rappelons les opérateurs logiques en C#. Ils sont souvent utilisés pour construire des expressions logiques (booléennes). Les opérateurs logiques sont : &&, ||, ! et ^.

Opérateurs logiques && et ||

Les opérateurs logiques && (ET logique) et || (OU logique) ne sont utilisés que sur des expressions booléennes (valeurs de type bool). Pour que le résultat - de la comparaison de deux expressions avec l'opérateur && - soit vrai (true), les deux opérandes doivent avoir la valeur true. Par exemple :

  1. bool result = (2 < 3) && (3 < 4);

Cette expression est «vraie» car les deux opérandes (2 < 3) et (3 < 4) sont «vrais». L'opérateur logique && est également appelé «court-circuit» car il ne perd pas de temps dans des calculs supplémentaires inutiles. Il évalue la partie gauche de l'expression (le premier opérande) et si le résultat est faux, il ne perd pas de temps à évaluer le deuxième opérande - il n'est pas possible que le résultat final soit «vrai» lorsque le premier opérande n'est pas «vrai». Pour cette raison, il est également appelé «opérateur logique de court-circuit» «et».

De même, l'opérateur || renvoie vrai si au moins l'un des deux opérandes a la valeur «vrai». Exemple :

  1. bool result = (2 < 3) || (1 == 2);

Cet exemple est "vrai", car son premier opérande est "vrai". Tout comme l'opérateur &&, le calcul est effectué rapidement : si le premier opérande est vrai, le deuxième n'est pas calculé du tout, car le résultat est déjà connu. On l'appelle aussi opérateur logique de court-circuit "ou".

Opérateurs logiques & et |

Les opérateurs de comparaison & et | sont respectivement similaires à && et ||. La différence réside dans le fait que les deux opérandes sont calculés l'un après l'autre, bien que le résultat final soit connu à l'avance. C'est pourquoi ces opérateurs de comparaison sont également appelés opérateurs logiques de circuit complet et sont très rarement utilisés.

Par exemple, lorsque deux opérandes sont comparés avec & et que le premier est évalué "faux", le calcul du deuxième opérande est quand même exécuté. Le résultat est clairement "faux". De même, lorsque deux opérandes sont comparés avec | et que le premier est "vrai", on évalue quand même le deuxième opérande et le résultat final est néanmoins "vrai".

Il ne faut pas confondre les opérateurs booléens & et | avec les opérateurs bit à bit & et |. Bien qu'ils soient écrits de la même manière, ils prennent des paramètres différents (expressions booléennes ou entières) et renvoient des résultats différents (booléens ou entiers) et leurs actions ne sont pas identiques.

Opérateurs logiques ^ et !

L'opérateur ^, également connu sous le nom de OU exclusif (XOR), fait partie des opérateurs à circuit complet, car les deux opérandes sont calculés l'un après l'autre. Le résultat de l'application de l'opérateur est vrai si exactement l'un des opérandes est vrai, mais pas les deux simultanément. Sinon, le résultat est faux. Voici un exemple :

  1. Console.WriteLine("Exclusif OU: "+ ((2 < 3) ^ (4 > 3)));

Le résultat est le suivant :

Exclusif OU: False

L'expression précédente est évaluée comme fausse, car les deux opérandes : (2 <3) et (4 > 3) sont vrais.

L'opérateur ! renvoie la valeur inversée de l'expression booléenne à laquelle il est attaché. Exemple :

  1. bool value = !(7 == 5); // True
  2. Console.WriteLine(value);

L'expression ci-dessus peut être lue comme "l'opposé de la vérité de la phrase "7 == 5". Le résultat de ce modèle est True (l'opposé de False). Notez que lorsque nous affichons la valeur true, elle s'affiche sur la console sous la forme "True" (avec une majuscule). Ce "défaut" provient du langage VB.NET fonctionnant également dans .NET Framework.

Instructions conditionnelles "if" et "if-else"

Après avoir vu comment comparer des expressions, nous allons continuer avec les instructions conditionnelles, nous permettant d'implémenter la logique de programmation.

Les instructions conditionnelles if et if-else sont des instructions de contrôle conditionnelles. Grâce à elles, le programme peut se comporter différemment en fonction d'une condition définie vérifiée lors de l'exécution de l'instruction.

Instruction conditionnelle "if"

Le format principal des instructions conditionnelles si est le suivant :

if (expression booléenne) {
   Corps de l'instruction conditionnelle ;
}

Il comprend : la clause if, l'expression booléenne et le corps de l'instruction conditionnelle.

L'expression booléenne peut être une variable booléenne ou une expression logique booléenne. Les expressions booléennes ne peuvent pas être des entiers (contrairement à d'autres langages de programmation comme C et C++).

Le corps de l'instruction est la partie enfermée entre les accolades : {}. Elle peut être constituée d'une ou plusieurs opérations (instructions). Lorsqu'il y a plusieurs opérations, on a un opérateur de bloc complexe, c'est-à-dire une suite de commandes qui se succèdent, enfermées dans des accolades.

L'expression entre les accolades suivant le mot clef if doit renvoyer la valeur booléenne true ou false. Si l'expression est calculée à la valeur true, alors le corps d'une instruction conditionnelle est exécuté. Si le résultat est false, alors les opérateurs du corps seront ignorés.

Prenons un exemple d'utilisation d'une instruction conditionnelle if :

  1. static void Main() {
  2.  Console.WriteLine("Entrez deux chiffres.");
  3.  Console.Write("Entrez le premier numéro :");
  4.  int premierNombre = int.Parse(Console.ReadLine());
  5.  Console.Write("Entrez le deuxième numéro :");
  6.  int deuxiemeNombre = int.Parse(Console.ReadLine());
  7.  int grandNombre = premierNombre;
  8.  if (deuxiemeNombre > premierNombre) {
  9.   grandNombre = deuxiemeNombre;
  10.  }
  11.  Console.WriteLine("Le plus grand nombre est : {0}", grandNombre);
  12. }

Si nous commençons l'exemple et saisissons les nombres 4 et 5, nous obtiendrons le résultat suivant :

Entrez deux chiffres.
Entrez le premier numéro : 3
Entrez le deuxième numéro : 7
Le plus grand nombre est : 7

Instruction conditionnelle "if" et accolades

Si nous n'avons qu'un seul opérateur dans le corps de l'instruction if, les accolades désignant le corps de l'opérateur conditionnel peuvent être omises, comme indiqué ci-dessous. Cependant, il est recommandé de les utiliser même si nous n'avons qu'un seul opérateur. Cela rendra le code plus lisible.

Voici un exemple d'omission des accolades pouvant prêter à confusion :

  1. int a = 3;
  2. if (a > 7)
  3.      Console.WriteLine("La variable est supérieure à 7.");
  4.      Console.WriteLine("Ce code s'exécutera toujours !");
  5.      // Mauvaise pratique : code trompeur

Dans cet exemple, le code est formaté de manière trompeuse et donne l'impression que les deux instructions d'affichage font partie du corps du bloc if. En fait, cela n'est vrai que pour la première.

Placez toujours des accolades { } pour le corps des blocs «if» même s'ils ne sont constitués que d'un seul opérateur !

Instruction conditionnelle "if-else"

En C#, comme dans la plupart des langages de programmation, il existe une instruction conditionnelle avec clause else : l'instruction if-else. Son format est le suivant :

if (expression booléenne) {
   Corps de l'instruction conditionnelle ;
} else {
   Corps de l'instruction else ;
}

Le format de la structure if-else se compose du mot réservé if, de l'expression booléenne, du Corps de l'instruction conditionnelle, du mot réservé else et de Corps de l'instruction else. Le corps de la structure else peut être constitué d'un ou plusieurs opérateurs, placés entre accolades, comme le corps d'une instruction conditionnelle.

Cette instruction fonctionne comme suit : l'expression entre parenthèses (une expression booléenne) est calculée. Le résultat du calcul doit être booléen - vrai ou faux. Selon le résultat, il y a deux résultats possibles. Si l'expression booléenne est calculée à true, le corps de l'instruction conditionnelle est exécuté et l'instruction else est omise et ses opérateurs ne s'exécutent pas. Sinon, si l'expression booléenne est calculée à false, le corps else est exécuté, le corps principal de l'instruction conditionnelle est omis et les opérateurs qu'elle contient ne sont pas exécutés.

Exemple d'instruction conditionnelle "if-else"

Examinons l'exemple suivant et illustrons le fonctionnement de l'instruction if-else :

  1. static void Main() {
  2.  int x = 3;
  3.  if (x > 7) {
  4.   Console.WriteLine("x est supérieur à 7");
  5.  } else {
  6.   Console.WriteLine("x n'est pas supérieur à 7");
  7.  }
  8. }

Le code du programme peut être interprété comme suit : si x>7, le résultat à la fin est : "x est supérieur à 7", sinon (else) le résultat est : "x n'est pas supérieur à 7". Dans ce cas, puisque x=3, après le calcul de l'expression booléenne l'opérateur de la structure else sera exécuté. Le résultat de l'exemple est :

x n'est pas supérieur à 7

Instructions "if" imbriquées

Parfois, la logique de programmation d'un programme ou d'une application doit être représentée par plusieurs structures if contenues les unes dans les autres. Nous les appelons structures if imbriquées ou structures if-else imbriquées.

Nous appelons imbrication le placement d'une structure if ou if-else dans le corps d'une autre structure if ou else. Dans de telles situations, chaque clause else correspond à la clause if précédente la plus proche. C'est ainsi que nous comprenons quelle clause else se rapporte à quelle clause if.

Il n'est pas recommandé de dépasser trois niveaux imbriqués, c'est-à-dire que nous ne devons pas imbriquer plus de trois instructions conditionnelles les unes dans les autres. Si pour une raison quelconque nous devons imbriquer plus de trois structures, nous devons exporter une partie du code dans une méthode séparée.

Voici un exemple d'utilisation de structures if imbriquées :

  1. int first = 7;
  2. int second = 3;
  3. if (first == second) {
  4.  Console.WriteLine("Ces deux nombres sont égaux.");
  5. } else {
  6.  if (first > second) {
  7.   Console.WriteLine("Le premier nombre est plus grand.");
  8.  } else {
  9.   Console.WriteLine("Le deuxième nombre est plus grand.");
  10.  }
  11. }

Dans l'exemple ci-dessus, nous avons deux nombres et nous les comparons en deux étapes : nous comparons d'abord s'ils sont égaux et si ce n'est pas le cas, nous comparons à nouveau pour déterminer lequel est le plus grand. Voici le résultat de l'exécution du code ci-dessus :

Le premier nombre est plus grand.

Séquences de «if-else-if-else-...»

Parfois, nous devons utiliser une séquence de structures if, où la clause else est une nouvelle structure if. Si nous utilisons des structures if imbriquées, le code serait poussé trop loin vers la droite. C'est pourquoi dans de telles situations, il est permis d'utiliser un nouveau if juste après le else. C'est même considéré comme une bonne pratique. Voici un exemple :

  1. char ch = 'X';
  2. if (ch == 'A' || ch == 'a') {
  3.  Console.WriteLine("Voyelle [a]");
  4. } else if (ch == 'E' || ch == 'e') {
  5.  Console.WriteLine("Voyelle [e]");
  6. } else if (ch == 'I' || ch == 'i') {
  7.  Console.WriteLine("Voyelle [i]");
  8. } else if (ch == 'O' || ch == 'o') {
  9.  Console.WriteLine("Voyelle [o]");
  10. } else if (ch == 'U' || ch == 'u') {
  11.  Console.WriteLine("Voyelle [u]"); 
  12. } else if (ch == 'Y' || ch == 'y') {
  13.  Console.WriteLine("Voyelle [i grec]");  
  14. } else {
  15.  Console.WriteLine("Consonne");
  16. }

Le programme de l'exemple effectue une série de comparaisons d'une variable pour vérifier si elle fait partie des voyelles de l'alphabet français. Chaque comparaison suivante n'est effectuée que dans le cas où la comparaison précédente n'était pas vraie. Au final, si aucune des conditions if n'est remplie, la dernière clause else est exécutée. Ainsi, le résultat de l'exemple est le suivant :

Consonne

Instructions conditionnelles «if» - Bonnes pratiques

Voici quelques lignes directrices recommandez pour la rédaction de structures if :

Instruction conditionnelle «switch-case»

Dans la section suivante, nous aborderons l'instruction conditionnelle switch. Elle permet de choisir parmi une liste de possibilités.

Comment fonctionne l'instruction «switch-case» ?

La structure switch-case choisit quelle partie du code de programmation exécuter en fonction de la valeur calculée d'une certaine expression (le plus souvent de type entier). Le format de la structure pour choisir une option est le suivant :

switch (sélecteur_entier) {
   case valeur_entiere_1:
      instructions;
      break;
   case valeur_entiere_2:
   instructions;
      break;
   // ...
   default:
      instructions;
      break;
}

Le sélecteur est une expression renvoyant une valeur résultante pouvant être comparée, comme un nombre ou une chaîne de caractères. L'opérateur switch compare le résultat du sélecteur à chaque valeur répertoriée dans les étiquettes case dans le corps de la structure switch. Si une correspondance est trouvée dans une étiquette case, la structure correspondante est exécutée (simple ou complexe). Si aucune correspondance n'est trouvée, l'instruction default est exécutée (lorsqu'elle existe). La valeur du sélecteur doit être calculée avant de la comparer aux valeurs à l'intérieur de la structure switch. Les étiquettes ne doivent pas avoir de valeurs répétitives, elles doivent être uniques.

Comme on peut le voir à partir de la définition ci-dessus, chaque case se termine par l'opérateur break, terminant le corps de la structure switch. Le compilateur C# requiert le mot break à la fin de chaque section case contenant du code. Si aucun code n'est trouvé après une instruction case, le break peut être omis et l'exécution passe à l'instruction case suivante et continue jusqu'à ce qu'elle trouve un opérateur break. Après la structure par défaut, le break est obligatoire.

Il n'est pas nécessaire que la clause par défaut soit la dernière, mais il est recommandé de la placer à la fin, et non au milieu de la structure du commutateur.

Règles pour les expressions dans switch

L'instruction switch est un moyen clair d'implémenter une sélection parmi de nombreuses options (à savoir, un choix parmi quelques manières alternatives d'exécuter le code). Elle nécessite un sélecteur, qui est calculé sur une certaine valeur. Le type de sélecteur peut être un nombre entier, un caractère, une chaîne ou une énumération. Si nous voulons utiliser par exemple un tableau ou un float comme sélecteur, cela ne fonctionnera pas. Pour les types de données non entiers, nous devons utiliser une série d'instructions if.

Utilisation de plusieurs étiquettes

L'utilisation de plusieurs étiquettes est appropriée lorsque nous souhaitons exécuter la même structure dans plusieurs cas. Regardons l'exemple suivant :

  1. int number = 8;
  2. switch (number) {
  3.  case 1:case 4:case 6:case 8:case 10:
  4.   Console.WriteLine("Le nombre n'est pas premier !"); 
  5.   break;
  6.  case 2:case 3:case 5:case 7:
  7.   Console.WriteLine("Le nombre est premier !"); 
  8.   break;
  9.  default:
  10.   Console.WriteLine("Numéro inconnu !"); 
  11.   break;
  12. }

Dans l'exemple ci-dessus, nous implémentons plusieurs étiquettes en utilisant des instructions case sans pause après elles. Dans ce cas, la valeur entière du sélecteur est d'abord calculée, c'est-à-dire 8, puis cette valeur est comparée à chaque valeur entière dans les instructions case. Lorsqu'une correspondance est trouvée, le bloc de code la suivant est exécuté. Si aucune correspondance n'est trouvée, le bloc par défaut est exécuté. Le résultat de l'exemple ci-dessus est le suivant :

Le nombre n'est pas premier !

Bonnes pratiques lors de l'utilisation de "switch-case"



PARTAGER CETTE PAGE SUR
Dernière mise à jour : Samedi, le 21 décembre 2024