C # 7 в дълбочина: Проучване на локални функции

Поддръжката на локални функции е отлична нова функция, въведена в C # 7. Имайте предвид, че можете да дефинирате локални функции във всеки метод, конструктор на клас или в свойство - както getter, така и setter. Когато се компилира от компилатора C #, локалната функция се трансформира в частен метод.

Когато разработвате приложения, често може да се наложи да създавате методи, които не се използват повторно - те се нуждаят само за модулност. Може да не искате вашите методи да бъдат дълги, тъй като поддържането на такива методи ще се превърне в кошмар с течение на времето. Въпреки това може да получите много частни методи, които няма да бъдат използвани повторно, нали? Тази нова функция в C # 7 идва на помощ при такива обстоятелства - можете да дефинирате функции, които са локални за друг обхват, или може да бъде вътре в друга функция или дори вътре в свойство (както getter, така и setter).

Представете си ситуация, в която ще ви трябва помощна функция, която ще бъде извикана само веднъж. Преди C # 7 да е бил наоколо, можете да постигнете това, като използвате типове Func и Action с анонимни методи. Имаше обаче няколко предизвикателства. Те не поддържат генерични лекарства, параметри и параметри за справка и излизане.

С C # 7 наоколо, вече можете да декларирате такива функции в друго тяло на друга функция. Такива функции са известни като локални функции. С други думи, поддръжката на локални функции ви позволява да дефинирате функция в обхвата на друга функция.

Внедряване на локални функции в C #

Нека напишем малко код и да видим как работят локалните функции. Помислете за следния кодов фрагмент. Имайте предвид, че методът Sum е дефиниран в тялото на метода Main в кодовия фрагмент, който следва.

 static void Main(string[] args)

        {

            int Sum(int x, int y)

            {

                return x + y;

            }

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

            Console.ReadKey();

        }

В този пример методът Sum е локална функция - той е локален за метода Main. С други думи, методът Sum може да се използва само вътре в метода Main, т.е. метода, в който е дефиниран.

Локалните функции могат да имат всички характеристики на обикновен метод, с изключение на това, че локалните функции не могат да имат статичен характер. Локалната функция дори може да бъде асинхронна и може да има достъп до променливи и от заграждащия блок. Параметри и локални променливи от обхващащия обхват могат да се използват вътре в локална функция, подобно на ламбда изразите. Трябва да се отбележи, че уловените локални променливи се предават на локална функция чрез препратка. Ето още един пример, който илюстрира как локалната функция може да осъществи достъп до променливите от заграждащия си тип.

public static void Display(string str)

        {

            int ctr = 5;

            DisplayText();

            void DisplayText ()

            {

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

                Console.WriteLine(str);

            }

        }

Сега се обърнете към кодовия фрагмент, даден по-горе. Методът на дисплея съдържа параметър на низ и целочислена променлива вътре в него. Имайте предвид, че локалната функция, дефинирана в метода Display (наречена DisplayText), може да има достъп до локалните променливи, а също и аргумента на метода Display. Хубава функция, нали?

Едно от основните предимства на локалните функции е капсулирането - локална функция може да бъде извикана само от нейния заграждащ тип. Имайте предвид, че ако имате частен метод във вашия клас, всеки член на класа може да извика частния метод.