Как да работя с делегати в C #

Делегатът е типов безопасен функционален указател, който може да препраща към метод, който има същия подпис като този на делегата. Можете да се възползвате от делегатите в C #, за да внедрите събития и методи за обратно извикване. Делегат на мултикаст е този, който може да сочи към един или повече методи, които имат идентични подписи.

Разбиране на делегатите в C #

По същество делегатът има препратка към метод, а също и към целевия обект, на който методът трябва да бъде извикан. Делегатите в C # са подобни на указателите на функции в C ++, но делегатите на C # са безопасни за типа. Можете да предавате методи като параметри на делегат, за да позволите на делегата да сочи към метода. Делегатите се използват за дефиниране на методи за обратно извикване и реализиране на обработка на събития и се декларират с помощта на ключовата дума „делегат“. Можете да декларирате делегат, който може да се появи сам или дори да е вложен в клас.

Има три стъпки при използване на делегати. Те включват декларация, екземпляр и извикване. 

Подписът на делегат изглежда така:

делегирайте идентификатор на тип резултат ([параметри])

Следното изявление показва как можете да декларирате делегат.

публичен делегат void MyDelegate (текстов низ);

Както можете да видите в горното изявление, името на делегата е „MyDelegate“, има връщащ тип „void“ и приема обект на низ като аргумент. Това предполага, че делегатът MyDelegate може да сочи към метод, който има идентичен подпис. Това обаче е само декларация - трябва да създадете екземпляр на делегат, преди да можете да го използвате. Посоченото по-долу изявление показва как можете да създадете екземпляр на декларирания по-горе.

MyDelegate d = нов MyDelegate (ShowText);

След като декларирате и създадете екземпляр на делегата, можете лесно да извикате метода, към който делегатът сочи.

d („Здравей, свят ...“);

Тук d е екземпляр на делегат

Можете също така да извикате метода, към който делегираният екземпляр сочи, използвайки метода Invoke () на екземпляра на делегата, както е показано по-долу.

d.Invoke („Hello World ...“);

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

int резултат = d (12, 15);

Ето пълния списък с кодове за справка.

използване на система;

Пространство от имена Делегати

{

    публичен делегат int MyDelegate (int x, int y);

    клас Програма

    {

      статична int сума (int x, int y)

        {

            връщане x + y;

        }

        статична празнота Главна ()

        {

            MyDelegate d = нов MyDelegate (Сума);           

            int резултат = d.Invoke (12, 15);

            Console.WriteLine (резултат);

            Console.ReadLine ();

        }

    }

Делегати в действие в C #

Ето пълния списък с кодове.

използване на система;

Пространство от имена Делегати

{

    публичен делегат void MyDelegate (текстов низ);

    клас Програма

    {

        публична статична невалидна ShowText (текстов низ)

        {

            Console.WriteLine (текст);

        }

        статична празнота Главна ()

        {

            MyDelegate d = нов MyDelegate (ShowText);

            d („Здравей, свят ...“);

            Console.ReadLine ();

        }

    }

}

Имайте предвид, че можете да присвоите множество обекти на екземпляр на делегат, като използвате оператора +, което прави делегата мултикастинг делегат. Можете също да комбинирате делегирани екземпляри, използвайки статичния метод Combine.

Времетраенето поддържа списък (наричан още списък с призовавания) вътрешно, за да изпълнява множество методи. Следният списък с кодове показва как можете да използвате метода Combine (), за да комбинирате множество екземпляри за делегиране.

myDelegate d1 = нов myDelegate (Метод1);

myDelegate d2 = нов myDelegate (Метод2);

myDelegate multicastDelegate = (myDelegate) Delegate.Combine (d1, d2);

multicastDelegate.Invoke ();

Делегат, който може да сочи към множество методи, е известен като мултикаст делегат. Имайте предвид, че екземплярите на делегата са неизменни. Така че, когато комбинирате делегати или извадите един екземпляр на делегат от списъка, се създава нов екземпляр на делегат, който представлява актуализирания или нов списък на целите или методите, които трябва да бъдат извикани.

Делегати за многоадресно предаване в действие в C #

Следният списък с кодове илюстрира делегиране на мултикаст. Обърнете внимание на използването на екземпляра на делегата: Тук използвахме оператора + =, за да присвоим делегата на множество методи, които имат идентични подписи.

използване на система;

Пространство от имена Делегати

{

    публичен делегат void MyDelegate ();

    клас Програма

    {

        public static void Method1 ()

        {

            Console.WriteLine ("Вътрешен метод1 ...");

        }

        public static void Method2 ()

        {

            Console.WriteLine ("Вътрешен метод2 ...");

        }

        статична празнота Главна ()

        {

            MyDelegate d = нула;

            d + = Метод1;

            d + = Метод2;

            d.Invoke ();

            Console.ReadLine ();

        }

    }

}

Делегатите са идеално пригодени за прилагане на програмирани от събития. Делегатът не трябва да знае класа на обекта, към който се отнася. Всичко, което трябва да знае, е подписът на метода, към който би насочил. Правилното използване на делегатите може да насърчи повторната употреба във вашия код и гъвкавостта във вашите проекти. Можете да се обърнете към онлайн документацията на Microsoft за повече информация относно делегатите.