Fonctions locales

On les appelle Local Functions en anglais, une fonctionnalité disponible depuis C# 7.0.

Nous avons vu précédemment comment appeler des méthodes. Dans le bloc de code d’une méthode, il est possible d’appeler d’autres méthodes selon ces règles :

  • Méthodes au sein de la même classe : appelez-les directement par leur nom en transmettant les paramètres.
  • Méthodes d’une autre classe : créez d’abord une instance de la classe cible, et la méthode cible doit être marquée public.

À partir de C# 7.0, vous pouvez définir des fonctions autonomes directement à l’intérieur d’une méthode : ce sont lesfonctions locales.

  1. Isolation : elles ne peuvent être appelées que depuis la méthode qui les contient, le code externe n’y a pas accès.
  2. Avantages : regroupe la logique associée, améliore la lisibilité et facilite la maintenance.
  3. Règle de déclaration : contrairement aux variables locales, une fonction locale peut être déclarée n’importe où dans la méthode englobante, sans déclaration anticipée.

Les fonctions locales peuvent capturer les variables locales de la méthode externe, mais leur portée reste limitée à cette méthode.


Commençons par rappeler un concept essentiel :

Les variables locales dans une fonction s’exécutent de haut en bas. Il faut déclarer une variable avant de l’utiliser, l’inverse n’est pas autorisé.

Prenons l’exemple ci-dessous : la variable hour est définie plus bas, il est impossible de l’utiliser avant sa déclaration.

    int GetHours()
    {
        Console.WriteLine(hour);
        int hour = DateTime.Now.Hour;
        return hour;
    }Langage du code : C# (cs)

Même si la portée de hour couvre l’ensemble du corps de la méthode, on ne peut pas l’utiliser avant de l’avoir déclarée.

Une erreur avec un soulignement ondulé rouge apparaît, comme visible sur l’image ci-dessus.

Cela diffère des méthodes classiques. Une méthode déclarée plus bas peut être appelée depuis le haut, car les méthodes de classe sont des membres de classe enregistrés dans la Method Table. L’appel se fait par consultation de cette table, pas selon un ordre strictement descendant.

Dans l’exemple suivant, Main appelle GetHours défini après lui. Ce comportement diffère des règles sur les variables locales.

class Program
{
    static void Main()
    {
        Program program = new Program();
        program.GetHours();
    }

    int GetHours()
    {
        int hour = DateTime.Now.Hour;
        return hour;
    }
}Langage du code : C# (cs)

Revenons aux fonctions locales.

Voici un exemple :



class Program
{
    static void Main()
    {
        Program program = new Program();
        program.ZoomIn();
    }

    public void ZoomIn()
    {
        // On peut appeler la fonction locale avant sa définition
        int results0 = ZoomIn5(10);
        Console.WriteLine($"A: {results0}");

        // Fonction locale : multiplie la valeur val reçue par 5 et retourne le résultat
        int ZoomIn5(int val)
        {
            return val * 5;
        }

        // Appel de la fonction locale
        int results = ZoomIn5(10);
        Console.WriteLine($"B: {results}");

        int results2 = ZoomIn5(5);
        Console.WriteLine($"C: {results2}");
    }
}
Langage du code : C# (cs)

La portée d’une fonction locale est limitée à la méthode qui la contient. On peut l’appeler aussi bien avant qu’après sa déclaration dans cette méthode.

De plus, le nom d’une fonction locale peut être identique à celui de la méthode qui l’englobe.



class Program
{
    static void Main()
    {
        Program program = new Program();
        program.ZoomIn5();
    }

    public void ZoomIn5()
    {
        // On peut appeler la fonction locale avant sa définition
        int results0 = ZoomIn5(10);
        Console.WriteLine($"A: {results0}");

        // Fonction locale : multiplie la valeur val reçue par 5 et retourne le résultat
        int ZoomIn5(int val)
        {
            return val * 5;
        }

        // Appel de la fonction locale
        int results = ZoomIn5(10);
        Console.WriteLine($"B: {results}");

        int results2 = ZoomIn5(5);
        Console.WriteLine($"C: {results2}");
    }
}
Langage du code : C# (cs)

Ici, la méthode externe et la fonction locale portent toutes deux le nom ZoomIn5. Il n’y a pas de conflit de nommage car leurs portées sont différentes, mais cette pratique n’est pas recommandée.

Fonctions locales

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *