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!