Dichiarazione e utilizzo di funzioni locali in C#

A partire da C# 7.0 il linguaggio supporta i metodi o funzioni locali.

Capita spesso che un metodo di una classe C# sia utile e debba essere invocato solo all’interno di un altro.
Supponiamo per esempio di avere implementato un metodo per il calcolo del fattoriale di un numero:

int Fattoriale(int num)
{
       if(num<=1)
         return num;
       return num*Fattoriale(num-1); 
}

Implementiamo ora un metodo che calcola i fattoriali di diversi numeri da 0 a n, con un ciclo for al cui interno viene invocato appunto il metodo Fattoriale appena visto:

public void CalcolaFattoriali(int n)
{
    for(int i=0;i<n;i++)
    {
       Console.WriteLine("fattoriale({0}) = {1}", i, Fattoriale(i));
    }
}

Se volessimo rendere il metodo Fattoriale una funzione o metodo locale a quello CalcolaFattoriali, ed evitare di renderlo disponibile al resto della classe, è possibile spostare la sua definizione all’interno del metodo che lo utilizza:

public void CalcolaFattoriali(int n)
{
     for(int i=0;i<n;i++)
     {
        Console.WriteLine("fattoriale({0}) = {1}", i, Fattoriale(i));
     }
     int Fattoriale(int num)
     {
       if(num<=1)
         return num;
       return num*Fattoriale(num-1); 
     }
 }

Si noti come il metodo Fattoriale, possa essere definito in qualunque punto, primo o dopo il suo utilizzo, addirittura potrebbe essere definito all’interno del ciclo for precedente.

for (int i = 0; i < max; i++)
 {
     Console.WriteLine("fattoriale({0}) = {1}", i, Fattoriale(i));

     int Fattoriale(int num)
     {
         Console.WriteLine("Sono all'interno del ciclo {0}", i);
        return num <= 1 ? num : num * Fattoriale(num - 1); 
     }
}

Per ulteriori dettagli consulta Programmare con C# 7, guida completa

in attesa della nuova edizione aggiornata a C# 8, presto in libreria!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *