CodeGym /Cours /C# SELF /Fonctions locales

Fonctions locales

C# SELF
Niveau 11 , Leçon 4
Disponible

1. Introduction

Tout développeur le sait : les fonctions (ou méthodes), c’est un peu les "bêtes de somme" de n’importe quelle appli. Elles nous aident à structurer le code, à réutiliser la logique et à éviter de se noyer dans des copier-coller sans fin. Jusqu’ici, toutes les fonctions que tu as utilisées étaient des "voisines" dans le corps d’une classe ou d’une structure.

Mais imagine que tu as une grosse fonction avec un bout de logique pas très grand, que tu aimerais sortir proprement, sans l’exposer à tout le projet. Genre, un calcul d’appoint dans une méthode, qui ne sert nulle part ailleurs.

Dans ce cas, les fonctions locales viennent à la rescousse.

Une fonction locale — c’est une fonction déclarée à l’intérieur d’une autre fonction (méthode, constructeur, propriété ou même une autre fonction locale). Et cette fonction locale n’est visible que par son "parent" et nulle part ailleurs.

Syntaxe des fonctions locales


void MainMethod()
{
    Console.WriteLine("Démarrage de la méthode principale.");            // Début du travail de la méthode principale.
    int result = InnerSum(5, 7);                              // Appel de la fonction locale InnerSum (somme interne)
    Console.WriteLine($"Résultat de la fonction locale : {result}");    // Résultat de la fonction locale : {result}

    // La fonction locale est déclarée directement dans MainMethod
    
  
int InnerSum(int a, int b) // Fonction locale pour additionner deux nombres { return a + b; // Retourne la somme de a et b }
}

Dans cet exemple, la fonction InnerSum est déclarée directement à l’intérieur de la méthode MainMethod. Elle n’est pas visible en dehors de la méthode principale — vraiment pas ! C’est comme une instruction secrète à partager seulement en privé.

2. Comment déclarer et où utiliser les fonctions locales

Règles de base

  • Une fonction locale peut être déclarée dans : une méthode, un constructeur, une propriété, un opérateur ou même une autre fonction locale !
  • Une fonction locale n’est visible que dans sa propre portée (scope).
  • Tu peux appeler les fonctions locales avant ou après leur déclaration dans la fonction parente (C# analyse tout à l’avance).

Exemple : calcul de la moyenne des notes


// Fonction principale pour afficher la moyenne des notes
void PrintAverageScore(int[] scores)
{
    if (scores.Length == 0)
    {
        Console.WriteLine("Pas de notes à calculer."); // Pas de notes à calculer.
        return;
    }

    double average = CalculateAverage(scores);
    Console.WriteLine($"Note moyenne : {average:0.00}"); // Note moyenne

    // Fonction locale pour calculer la moyenne
    
  
double CalculateAverage(int[] arr) { int sum = 0; foreach (var score in arr) sum += score; return (double)sum / arr.Length; // Retourne la moyenne }
} // Appel de la fonction : int[] myScores = { 5, 4, 3, 4, 5 }; PrintAverageScore(myScores); // Affichera : Note moyenne : 4.20

Tu vois comme c’est pratique ? Personne en dehors de PrintAverageScore ne peut utiliser sa logique interne — la fonction locale CalculateAverage. Cette approche aide à garder le code organisé et à ne pas polluer l’espace de noms global avec des méthodes utilitaires.

3. Fonctions locales et portée (scope)

Le gros avantage d’une fonction locale — c’est que sa portée est limitée à la méthode "parente". Ce comportement évite de "polluer" la classe avec des petites méthodes qui ne servent qu’à un seul endroit.


+-----------------+
|   Méthode de    |
|     classe      |
|    void Foo()   |
|                 |
|   +-----------+ |
|   |  Fonction | |
|   |   locale  | |
|   +-----------+ |
+-----------------+
La fonction locale existe seulement dans la méthode où elle est déclarée

Une fonction locale existe uniquement dans la méthode où elle est déclarée. Essayer d’y accéder de l’extérieur, c’est comme essayer d’appeler une ligne secrète dont tu n’as pas le numéro.

Si tu tentes d’appeler une fonction locale en dehors de la méthode parente, tu auras une erreur de compilation : Le nom '...' n’existe pas dans le contexte actuel.

Les fonctions locales peuvent voir les variables de leur parent

Les fonctions locales peuvent accéder à toutes les variables de la méthode parente — c’est vraiment leur super-pouvoir !


void ShowStudent(string name, int age)
{
    string message = BuildMessage();
    Console.WriteLine(message);

    // La fonction locale utilise les variables "name" et "age"
    
  
string BuildMessage() { return $"Nom : { name}, Âge : { age}"; }
}

Ça rend le code non seulement plus court, mais aussi beaucoup moins "bruyant". Pas besoin de passer dix paramètres à chaque méthode — la fonction locale "voit" tout ce qu’il y a dans le parent.

4. Fonctions locales dans les boucles et les conditions

Tu peux déclarer des fonctions locales à n’importe quel niveau d’imbrication — même dans des boucles ou des branches conditionnelles :


void ProcessNumbers(int[] numbers)
{
    foreach (int number in numbers)
    {
        if (number % 2 == 0)
        {
            Console.WriteLine($"{number} — pair");
            PrintEvenMessage();
        }
        else
        {
            Console.WriteLine($"{number} — impair");
        }

        
  
void PrintEvenMessage() { Console.WriteLine("C’est un nombre pair, félicitations !"); }
} }

Mais fais gaffe, ce genre de truc peut vite rendre le code moins lisible, surtout si tu mets trop de fonctions locales ou si elles deviennent longues. Faut pas en abuser, mais c’est bon à savoir que ça existe.

Fonction locale vs méthode privée classique

Critère Fonction locale Méthode privée de classe
Portée Seulement la fonction parente Toute la classe
Accès aux variables du parent Oui Non (seulement via les paramètres)
Lisibilité Haute Moyenne
Potentiel de réutilisation Faible Élevé
Testabilité Difficile à tester Facile à tester

5. Erreurs typiques et particularités d’implémentation

Erreur n°1 : faute de frappe ou oubli de déclaration de la fonction locale.
Si tu appelles une fonction locale avec un mauvais nom ou que tu oublies de la déclarer, le compilateur te sortira une erreur CS0103 ou CS0128, et ton code ne compilera pas.

Erreur n°2 : modification des variables capturées (closure).
Quand une fonction locale modifie une variable du contexte externe, tu peux avoir un résultat complètement inattendu — les variables capturées se comportent comme des copies ou des références, et leur modification impacte la logique.

Erreur n°3 : ignorer les suggestions de l’IDE pour convertir des méthodes privées.
Si tu laisses traîner des méthodes privées inutiles dans la classe alors que l’IDE (genre Rider) te propose de les transformer en fonctions locales, tu vas vite accumuler du "bruit" dans le code et perdre en lisibilité.

Erreur n°4 : trop de niveaux d’imbrication de fonctions locales.
Trop de niveaux de fonctions imbriquées rendent le code difficile à comprendre et à déboguer. La concision, c’est la clé pour un code facile à maintenir.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION