Funcții locale
Funcțiile locale reprezintă funcții definite în interiorul altor metode. O funcție locală, în general, conține acțiuni care sunt utilizate doar în cadrul metodei sale.
Să definim o metodă care compară suma numerelor din două array-uri:
void Compare(int[] numbers1, int[] numbers2)
{
int numbers1Sum = 0;
int numbers2Sum = 0;
foreach(int number in numbers1)
numbers1Sum += number;
foreach (int number in numbers2)
numbers2Sum += number;
if (numbers1Sum > numbers2Sum)
Console.WriteLine("suma numerelor din array-ul numbers1 este mai mare");
else if (numbers1Sum < numbers2Sum)
Console.WriteLine("suma numerelor din array-ul numbers2 este mai mare");
else
Console.WriteLine("sumele numerelor din ambele array-uri sunt egale");
}
int[] numbers1 = { 1, 2, 3 };
int[] numbers2 = { 3, 4, 5, 6, 7 };
Compare(numbers1, numbers2);
Aici metoda Compare primește două array-uri și calculează pe rând suma elementelor acestora pentru a determina în care array suma numerelor este mai mare. Deși totul funcționează, există un dezavantaj: se repetă acțiunile care calculează suma unui array:
int numbers1Sum = 0;
foreach(int number in numbers1)
numbers1Sum += number;
Ce se întâmplă dacă dorim să comparăm suma doar a numerelor pozitive sau a numerelor pare sau să schimbăm altfel logica de comparare? În acest caz, este mai bine să extragem acțiunile repetitive într-o metodă separată.
Totuși, dacă aceste acțiuni nu vor fi apelate nicăieri altundeva în program și vor fi utilizate doar într-o singură metodă, este logic să le definim ca funcție locală. Să modificăm metoda Compare în felul următor:
void Compare(int[] numbers1, int[] numbers2)
{
int numbers1Sum = Sum(numbers1);
int numbers2Sum = Sum(numbers2);
if (numbers1Sum > numbers2Sum)
Console.WriteLine("suma numerelor din array-ul numbers1 este mai mare");
else if (numbers1Sum < numbers2Sum)
Console.WriteLine("suma numerelor din array-ul numbers2 este mai mare");
else
Console.WriteLine("sumele numerelor din ambele array-uri sunt egale");
int Sum(int[] numbers)
{
int result = 0;
foreach (int number in numbers)
result += number;
return result;
}
}
int[] numbers1 = { 1, 2, 3 };
int[] numbers2 = { 3, 4, 5, 6, 7 };
Compare(numbers1, numbers2);
Aici calculul sumei este extras într-o funcție locală Sum, care primește un array și returnează suma acestuia. În cadrul metodei Compare, o putem folosi pentru a calcula suma unui array. Nu contează dacă funcția locală este definită înainte sau după utilizarea ei. Însă funcția locală nu poate fi folosită în afara metodei în care este definită.
Funcții locale statice
Funcțiile locale pot fi statice. Aceste funcții sunt definite folosind cuvântul cheie static. Particularitatea lor este că nu pot accesa variabilele din mediul înconjurător, adică din metoda în care funcția statică este definită.
Mai întâi, să definim o funcție locală care are acces la mediul înconjurător:
int Sum(int[] numbers)
{
int limit = 0;
int result = 0;
foreach (int number in numbers)
{
if (IsPassed(number)) result += number;
}
return result;
bool IsPassed(int number)
{
return number > limit;
}
}
int[] numbers1 = { -3, -2, -1, 0, 1, 2, 3 };
int[] numbers2 = { 3, -4, 5, -6, 7 };
Console.WriteLine(Sum(numbers1));
Console.WriteLine(Sum(numbers2));
Aici funcția Sum calculează suma numerelor din array care îndeplinesc condiția din funcția locală IsPassed(). Această funcție locală verifică dacă numărul transmis este mai mare decât valoarea variabilei limit, definită în metoda Sum. Adică funcția locală IsPassed poate accesa datele definite în funcția înconjurătoare Sum.
Acum să facem funcția IsPassed statică:
int Sum(int[] numbers)
{
int result = 0;
int limit = 0;
foreach (int number in numbers)
{
if (IsPassed(number, limit)) result += number;
}
return result;
static bool IsPassed(int number, int lim)
{
//return number > limit; // Eroare: metoda IsPassed nu are acces la variabila limit
return number > lim;
}
}
Modificatorul static este specificat înaintea tipului funcției locale. Acum funcția IsPassed nu poate accesa variabila limit, și în acest caz trebuie fie să transmitem această valoare ca parametru, fie să definim variabila limit direct în funcția locală.
Utilizarea funcțiilor locale statice poate ajuta la îmbunătățirea performanței și la clarificarea că funcția nu depinde de variabilele din mediul înconjurător.