C # 7 u dubini: Istraživanje lokalnih funkcija

Podrška za lokalne funkcije izvrsna je nova značajka koja je predstavljena u C # 7. Imajte na umu da lokalne funkcije možete definirati unutar bilo koje metode, konstruktora klase ili unutar svojstva - i gettera i settera. Kada ga kompajlira kompajler C #, lokalna funkcija pretvara se u privatnu metodu.

Prilikom razvijanja aplikacija možda ćete često trebati stvoriti metode koje se ne koriste ponovno - one su vam potrebne samo zbog modularnosti. Možda ne želite da vaše metode traju dugo jer bi održavanje takvih metoda s vremenom postalo noćna mora. Međutim, možda ćete na kraju imati mnogo privatnih metoda koje se ne bi mogle ponovno upotrijebiti, zar ne? Ova nova značajka u C # 7 dolazi u pomoć u takvim okolnostima - možete definirati funkcije koje su lokalne za drugi opseg, ili može biti unutar druge funkcije ili čak unutar svojstva (i gettera i settera).

Zamislite situaciju u kojoj bi vam trebala pomoćna funkcija koja bi se pozvala samo jednom. Prije nego što je postojao C # 7, to ste mogli postići koristeći vrste Func i Action anonimnim metodama. Međutim, bilo je nekoliko izazova. Nisu podržavali generičke, parametarske i ref i out parametre.

S okolo C # 7, sada možete deklarirati takve funkcije unutar drugog tijela druge funkcije. Takve su funkcije poznate kao lokalne funkcije. Drugim riječima, podrška za lokalne funkcije omogućuje vam definiranje funkcije unutar opsega druge funkcije.

Implementacija lokalnih funkcija u C #

Napišimo neki kod i vidjet ćemo kako funkcioniraju lokalne funkcije. Razmotrite sljedeći isječak koda. Napominjemo da je metoda Sum definirana unutar tijela metode Main u isječku koda koji slijedi.

 static void Main(string[] args)

        {

            int Sum(int x, int y)

            {

                return x + y;

            }

            Console.WriteLine(Sum(10, 20));

            Console.ReadKey();

        }

U ovom primjeru, metoda Sum je lokalna funkcija - lokalna je za metodu Main. Drugim riječima, metoda Sum može se koristiti samo unutar metode Main, tj. Metode unutar koje je definirana.

Lokalne funkcije mogu imati sve značajke uobičajene metode, osim što lokalne funkcije ne mogu biti statične prirode. Lokalna funkcija može biti čak i asinkrona i može imati pristup varijablama i iz priloženog bloka. Parametri i lokalne varijable obuhvaćajućeg opsega mogu se koristiti unutar lokalne funkcije, slično lambda izrazima. Treba imati na umu da se zarobljene lokalne varijable referencom prosljeđuju lokalnoj funkciji. Evo još jednog primjera koji ilustrira kako lokalna funkcija može pristupiti varijablama svog zatvorenog tipa.

public static void Display(string str)

        {

            int ctr = 5;

            DisplayText();

            void DisplayText ()

            {

                for(int i = 0; i < ctr; i++)

                Console.WriteLine(str);

            }

        }

Sada se pogledajte gore dani isječak koda. Metoda prikaza sadrži parametar niza i unutar njega cijelu varijablu. Imajte na umu da lokalna funkcija definirana unutar metode Display (nazvana DisplayText) može imati pristup lokalnim varijablama, a također i argument metode Display. Lijepa značajka, zar ne?

Jedna od glavnih prednosti lokalnih funkcija je enkapsulacija - lokalna se funkcija može pozvati samo iz njenog zatvorenog tipa. Imajte na umu da ako u klasi imate privatnu metodu, bilo koji član klase može se pozvati na privatnu metodu.