Funcții locale în C# (.NET)

O funcție declarată în interiorul unei metode, vizibilă doar acolo; poate folosi variabilele metodei, iar cu static nu le poate atinge.

Sintaxă C#
void Metoda() { int Ajutor(int x) => x * 2; Console.WriteLine(Ajutor(5)); }

Ce face Funcții locale

Funcțiile locale țin codul de ajutor lângă singura metodă care îl folosește, fără să aglomereze clasa. Pot fi apelate înainte de locul unde sunt declarate, pot fi recursive, generice sau async.

O funcție locală vede variabilele locale și parametrii metodei care o conține. Cu modificatorul static (C# 8) compilatorul interzice asta, ca să fii sigur că funcția depinde doar de parametrii ei.

Exemple

Exemplul 1: Validare cu funcție locală

Console.WriteLine(Medie([9, 10, 8]));
Console.WriteLine(Medie([9, 11]));

static string Medie(int[] note)
{
    if (!ToateValide())
        return "note invalide";
    return $"media: {note.Sum() / note.Length}";

    bool ToateValide()
    {
        foreach (int n in note)
            if (n < 1 || n > 10) return false;
        return true;
    }
}

Rezultat

media: 9
note invalide

Exemplul 2: Funcție locală statică și recursivă

static garantează că Factorial nu folosește variabile din jur.

for (int i = 1; i <= 5; i++)
    Console.Write($"{Factorial(i)} ");
Console.WriteLine();

static long Factorial(int n) => n <= 1 ? 1 : n * Factorial(n - 1);

Rezultat

1 2 6 24 120

Greșeli frecvente

  • O funcție locală static care folosește o variabilă a metodei dă eroarea CS8421.
  • Funcțiile locale nu pot avea modificatori de acces (public, private): sunt mereu vizibile doar în metoda lor.

Comenzi înrudite

  • Metode (static, void, return): O metodă grupează cod reutilizabil sub un nume: primește parametri, poate returna o valoare cu return sau nimic (void).
  • Expresii lambda (=>): O funcție scurtă, fără nume, scrisă pe loc: parametri => rezultat. Se folosește în LINQ, la evenimente și oriunde se cere un delegat.
  • Func, Action și Predicate: Tipurile de delegat gata făcute din .NET: Func returnează o valoare, Action nu returnează nimic, Predicate returnează bool.