# Programmation C sharp/Structures de contrôle

Le language C# est un langage de programmation structuré. La structure d'un programme définit l'ordre d'exécution des instructions : condition, boucles, ...

## Condition

Une instruction peut s'exécuter lorsqu'une condition est vraie. La syntaxe est la suivante :
expression définit la condition et doit être du type bool, c'est-à-dire qu'elle ne peut valoir que true (vrai) ou false (faux).
L'instruction n'est exécutée que si la condition est vraie (true).
Exemple :

### Plusieurs instructions

Pour exécuter plusieurs instructions si la condition est vraie, instruction peut être remplacé par un bloc d'instructions entre accolades :
Exemple :

### Sinon...

Il est possible d'exécuter des instructions quand une condition est vraie, et d'autres instructions quand elle est fausse.
La syntaxe est la suivante :
Exemples :

### Conditions multiples

L'enchaînement des instructions conditionnelles est possible.
Exemple :
Chaque instruction else correspond au if qui le précède, s'il n'a pas déjà de else. Cependant, pour clarifier le code ou résoudre certains cas ambigus (pas de else pour le second if, par exemple), il est préférable de mettre des accolades :
Autre exemple :
Dans cet exemple, chaque instruction if n'est testée que si la précédente est fausse. Si le nombre de cas est important et que chaque condition teste une valeur pour la même expression, il est préférable d'utiliser l'instruction switch.

## Tests de plusieurs cas

L'instruction switch permet de tester la valeur d'une expression avec plusieurs cas.
La syntaxe est la suivante :
Où cas peut avoir l'une des deux syntaxes suivantes :

### case constante

    Cas où l'expression vaut la constante spécifiée.

### default

    Cas où l'expression ne correspond à aucun autre cas (le cas par défaut).
fin du cas est une instruction spéciale terminant le ou les cas. Hormis les instructions interrompant le cours de l'exécution (une instruction interrompant ou continuant une boucle, une instruction throw pour lancer une exception, une instruction return), il s'agit en général de l'une des deux instructions suivantes :

### break;

    Fin du test, la prochaine instruction exécutée est celle située après l'accolade fermante de switch.

### goto cas;

    L'exécution se poursuit au cas indiqué.
Exemple :
La syntaxe permet de rassembler plusieurs cas ensemble pour exécuter les mêmes instructions :
Il est également possible de poursuivre le traitement avec les instructions d'un autre cas :

### Selon le type d'un objet

Le test avec un objet permet de tester des cas représentant un sous-type de sa classe.
Exemple pour traiter différemment les sous-classes de la classe Meuble (Armoire, Commode, Table, Chaise, Lit) :

### Cas conditionnels

Depuis C# 7.0, il est possible d'ajout une clause when aux cas pour définir une condition. Le même cas peut apparaitre plusieurs fois avec des conditions différentes.

## Boucles

Une boucle permet d'exécuter plusieurs fois une ou des instructions tant qu'une condition est vraie.

### Boucle while

La boucle while est la plus simple : tant que la condition est vraie, elle exécute l'instruction ou le bloc d'instructions spécifié.
Sa syntaxe est la suivante :
Où expression est une expression du type bool, c'est-à-dire valant true (vrai) ou false (faux).
Exemple : rechercher une valeur spécifique dans un tableau d'entiers
N.B.: Si la condition est fausse dès le début, l'instruction ou le bloc n'est pas exécuté, car la condition est testée avant.

### Boucle do...while

La boucle do...while ressemble à la précédente, excepté que la condition est testée après. C'est-à-dire que le bloc d'instructions est toujours exécuté au moins une fois.
La syntaxe est la suivante :
Où expression est une expression de type bool.
Exemple :

### Boucle for

La boucle for regroupe plusieurs phases de la boucle :
* L'initialisation, par exemple un indice dans un tableau,
* La condition, tant qu'elle est vraie la boucle continue,
* Les instructions à exécuter,
* L'instruction (ou les instructions) d'incrémentation, exécutée(s) juste avant de tester à nouveau la condition.
La syntaxe d'une boucle for est la suivante :
Exemple : afficher tous les éléments d'un tableau d'entiers jusqu'à trouver un zéro.

### Boucle foreach

La boucle foreach parcours tous les éléments d'un objet implémentant l'interface IEnumerable. Il s'agit d'une version simplifiée de la boucle for.
La syntaxe est la suivante :
Durant la boucle, la variable variable (de type type) vaut successivement toutes les valeurs retournées par l'objet implémentant l'interface IEnumerable.
Les tableaux implémentent cette interface, et peuvent donc être utilisés dans une boucle foreach.
Exemple : afficher tous les éléments d'un tableau

### Interrompre une boucle

L'instruction break permet d'interrompre prématurément une boucle.
Syntaxe :
Exemple :
Le code ci-dessus affiche :

### Continuer une boucle

L'instruction continue permet de poursuivre une boucle, c'est-à-dire passer immédiatement à l'itération suivante sans exécuter les autres instructions de la boucle.
Syntaxe :
Exemple :
Le code ci-dessus affiche :

### L'interface IEnumerable et le mot clé yield

L'interface IEnumerable est définie dans deux espaces de nom différents :
* System.Collections : (Framework 1.0) utilise le type object,
* System.Collections.Generic : (Framework 2.0) utilise un type générique.
Comme la plupart des classes de ces deux espaces de nom, ces deux classes ne diffèrent que par le type utilisé pour chaque élément : object ou générique. L'interface IEnumerable ne définit qu'une seule méthode :
* System.Collections.IEnumerable:
* System.Collections.Generic.IEnumerable:
L'implémentation d'une fonction retournant une instance de l'interface IEnumerator est simplifiée en utilisant le mot clé yield. Celui-ci est utilisé pour retourner chaque élément de l'itération ou pour interrompre l'itération :
* L'instruction yield return est suivie de la valeur de l'élément à retourner,
* L'instruction yield break interrompt la boucle prématurément.
Exemple :
Ce programme affiche :
Les fruits suivants ne sont pas affichés car le mot "fraise" a été trouvé.