• 20 hours
  • Easy

Free online content available in this course.

Paperback available in this course

course.header.alt.is_certifying

You can get support and mentoring from a private teacher via videoconference on this course.

Got it!

Last updated on 11/28/19

Les blocs de code et la portée d’une variable

Log in or subscribe for free to enjoy all this course has to offer!

Nous avons régulièrement utilisé dans le chapitre précédent les accolades ouvrantes et fermantes : { et }. Nous avons rapidement dit que ces accolades servaient à créer des blocs de code.

L'utilisation d'accolades implique également une autre subtilité. Vous l'avez vu dans le titre du chapitre, il s'agit de la portée d'une variable.

Regardons à présent comment cela fonctionne.

Les blocs de code

Les blocs de code permettent de grouper plusieurs instructions qui vont s’exécuter dans le même contexte.
Cela peut être le cas par exemple après un if, nous pourrions souhaiter effectuer plusieurs instructions. Par exemple :

decimal compteEnBanque = 300;
if (compteEnBanque >= 0)
{
    Console.WriteLine("Votre compte est créditeur");
    Console.WriteLine("Voici comment ouvrir un livret …");
}
else
{
    Console.WriteLine("Votre compte est débiteur");
    Console.WriteLine("N’oubliez pas que les frais de découverts sont de …");
}

Ici, nous enchaînons deux Console.WriteLine en fonction du résultat de la comparaison de compteEnBanque avec 0.

Les blocs de code seront utiles dès qu’on voudra regrouper plusieurs instructions. C’est le cas pour les instructions conditionnelles mais nous verrons beaucoup d’autres utilisations, comme le switch que nous avons vu juste au-dessus, les boucles ou les méthodes que nous allons aborder dans le chapitre suivant.

La portée d’une variable

C# … portée … on se croirait au cours de musique …

En fait, la « portée d’une variable » est la zone de code dans laquelle une variable est utilisable. Elle correspond en général au bloc de code dans lequel est définie la variable.

Ainsi, le code suivant :

static void Main(string[] args)
{
    string prenom = "Nicolas";
    string civilite = "M.";
    if (prenom == "Nicolas")
    {
        int age = 30;
        Console.WriteLine("Votre age est : " + age);
        switch (civilite)
        {
            case "M.":
                Console.WriteLine("Vous êtes un homme de " + age + " ans");
                break;
            case "Mme":
                Console.WriteLine("Vous êtes une femme de " + age + " ans");
                break;
        }
    }
    if (age >= 18)
    {
        Console.WriteLine(prenom + ", vous êtes majeur");
    }
}

est incorrect et provoquera une erreur de compilation. En effet, nous essayons d’accéder à la variable « age » en dehors du bloc de code où elle est définie. Nous voyons que cette variable est définie dans le bloc qui est exécuté lorsque le test d’égalité du prénom avec la chaine « Nicolas » est vrai alors que nous essayons de la comparer à 18 dans un endroit où elle n’existe plus.

Nous pouvons utiliser « age » sans aucun problème dans tout le premier if, et même dans les sous blocs de code, comme c’est le cas dans le sous bloc du switch, mais pas en dehors du bloc de code dans lequel la variable est définie. Ainsi, la variable « prenom » est accessible dans le dernier if car elle a été définie dans un bloc père.

Vous noterez qu’ici, la complétion nous est utile. En effet, Visual Studio Express propose de nous compléter le nom de la variable dans un bloc où elle est accessible. Dans un bloc où elle ne l’est pas, la complétion automatique ne nous la propose pas.
Comme Visual Studio Express est malin comme une machine, si la complétion ne propose pas ce que vous souhaitez, c’est probablement que vous n’y avez pas le droit. Une des explications peut être que la portée ne vous l’autorise pas.

Pour corriger l’exemple précédent, il faut déclarer la variable « age » au même niveau que la variable prénom.

Ok, mais alors, pourquoi on ne déclarerait pas tout au début une bonne fois pour toute ? Cela éviterait ces erreurs … non ?

Evidemment non, vous verrez qu’il n’est pas possible de faire cela. Généralement, l’utilisation de variables accessibles de partout est une mauvaise pratique de développement (c’est ce qu’on appelle des variables « globales »). Même si on peut avoir un équivalent en C#, il faut se rappeler que plus une variable est utilisée dans la plus petite portée possible, mieux elle sera utilisée et plus elle sera pertinente.
Je vous conseille donc d’essayer de déterminer le bloc de code minimal où l’utilisation de la variable est adaptée.

En résumé
  • Un bloc de code permet de regrouper des instructions qui commencent par { et qui finissent par }.

  • Une variable définie à l'intérieur d'un bloc de code aura pour portée ce bloc de code.

Example of certificate of achievement
Example of certificate of achievement