Aller au contenu

Portée (Scope)

"Les variables sont comme des secrets : elles ne sont connues que là où elles ont été dites."

Anonyme

Quand on écrit un programme, toutes les variables n’ont pas la même durée de vie ni la même zone d’existence.
C’est ce qu’on appelle la portée (scope en anglais).

💡 Comprendre la portée, c’est savoir où une variable “vit” et jusqu’où elle est visible dans le code.


Qu’est-ce que la portée ?

En C#, la portée d’une variable dépend de l’endroit où elle est déclarée.
Elle détermine où on peut l’utiliser et quand elle est détruite.

A retenir

Une variable déclarée dans une méthode existe seulement pendant l’exécution de cette méthode.
Une variable déclarée dans un bloc { } (comme une boucle ou un if) n’existe que dans ce bloc.


Exemple 1 : portée locale (dans un bloc)

for (int i = 0; i < 3; i++)
{
    int x = i * 2;
    Console.WriteLine(x);
}
Console.WriteLine(x); // ❌ Erreur : 'x' n'existe plus ici

Ici, la variable x n’existe que dans la boucle.
Quand on sort du bloc { }, elle est supprimée et invisible.


Exemple 2 : portée plus large (déclarée avant)

int x = 0;

for (int i = 0; i < 3; i++)
{
    x = i * 2;
}
Console.WriteLine(x); // ✅ OK, x est visible ici

La variable x est déclarée avant la boucle.
Elle reste accessible pendant et après la boucle.
Sa “durée de vie” dure jusqu’à la fin de la méthode.


Durée de vie et mémoire

Les variables locales (dans une méthode) sont stockées sur la pile (stack) : - Elles sont créées quand on entre dans la méthode (ou le bloc). - Elles sont automatiquement supprimées quand on en sort.

Cela signifie : - Quand on déclare une variable dans une boucle, elle est recréée à chaque itération. - Le coût est négligeable pour les types valeur (int, double, etc.) car la pile est rapide et optimisée.

Rappel : les types valeur vivent sur la pile (valeur directe) ;
les types référence ont une référence sur la pile mais l’objet vit sur le tas (heap).


Analogie

Imaginons que chaque bloc { } soit une boîte fermée :
les variables déclarées dedans restent dans la boîte.
Quand on ferme la boîte, les variables disparaissent avec elle.

Méthode (grande boîte)
 ├── Boucle (boîte interne)
 │    └── Variable locale x
 └── x disparaît quand la boucle se ferme

Résumé

  • La portée d’une variable = la zone du code où elle est accessible.
  • Une variable déclarée dans un bloc n’existe que dans ce bloc.
  • Une variable déclarée avant une boucle/if peut être utilisée après.
  • Les variables locales sont automatiquement détruites quand on quitte leur bloc.
  • Limiter la portée rend le code plus lisible, plus sûr et plus facile à maintenir.

Bonnes pratiques ✅

  • Déclarer les variables au plus près de leur première utilisation.
  • Donner-leur une portée minimale (ne pas “déborder” inutilement).
  • Si une variable doit survivre après une boucle, déclarer-la avant celle-ci.
  • Éviter de réutiliser la même variable pour des rôles différents au fil du code.
  • Préfèrer des noms clairs qui reflètent l’usage dans le bloc.

Exercice 💡

Que va afficher ce programme ?

int total = 0;

for (int i = 0; i < 3; i++)
{
    int valeur = i + 1;
    total += valeur;
}

Console.WriteLine(valeur); // ?
Console.WriteLine(total);
✅ Solution `valeur` est déclarée **dans la boucle**, donc elle **n’existe plus** après le bloc → **erreur de compilation**. `total` a été déclaré **avant la boucle**, il existe encore après → affiche **6**.

Schéma visuel

+-------------------------------------------------------+
| Méthode Main()                                        |
|                                                       |
|   int total = 0;   ← portée : toute la méthode        |
|                                                       |
|   for (...) {                                         |
|       int valeur = ...; ← portée : ce bloc seulement  |
|   }                                                   |
|                                                       |
|   Console.WriteLine(total);  // OK                    |
|   Console.WriteLine(valeur); // Erreur ❌             |
+-------------------------------------------------------+

Quiz

Testez vos connaissances sur la portée

1️⃣ Où une variable déclarée dans une boucle existe-t-elle ? ✅ Uniquement à l’intérieur de la boucle.

2️⃣ Que se passe-t-il quand on sort d’un bloc { } ? ✅ Les variables déclarées dans ce bloc sont détruites et invisibles.

3️⃣ Pourquoi vaut-il mieux limiter la portée d’une variable ? ✅ Pour éviter les erreurs, améliorer la lisibilité et libérer la mémoire plus tôt.


Navigation

Introduction Types valeur/référence Nommage Déclaration et affectation Portée (Scope)


Pour aller plus loin