Jak pracować z delegatami w C #

Delegat to bezpieczny typ wskaźnika funkcji, który może odwoływać się do metody, która ma taki sam podpis jak delegat. Możesz skorzystać z delegatów w języku C #, aby zaimplementować zdarzenia i metody wywołania zwrotnego. Delegat multiemisji to taki, który może wskazywać jedną lub więcej metod, które mają identyczne podpisy.

Zrozumienie delegatów w C #

W istocie delegat zawiera odniesienie do metody, a także do obiektu docelowego, na którym metoda powinna zostać wywołana. Delegaci w C # są podobni do wskaźników funkcji w C ++, ale delegaci C # są bezpieczni dla typów. Możesz przekazać metody jako parametry do delegata, aby umożliwić delegatowi wskazanie metody. Delegaci są używani do definiowania metod wywołania zwrotnego i implementowania obsługi zdarzeń. Są deklarowani za pomocą słowa kluczowego „delegate”. Możesz zadeklarować delegata, który może pojawiać się samodzielnie lub nawet zagnieżdżony w klasie.

Istnieją trzy kroki korzystania z delegatów. Obejmują one deklarację, tworzenie instancji i wywołanie. 

Podpis delegata wygląda następująco:

identyfikator typu wyniku delegata ([parametry])

Poniższa instrukcja pokazuje, jak można zadeklarować delegata.

delegat publiczny void MyDelegate (tekst ciągu);

Jak widać w powyższej instrukcji, delegat ma nazwę „MyDelegate”, zwraca typ „void” i przyjmuje obiekt typu string jako argument. Oznacza to, że delegat MyDelegate może wskazywać metodę, która ma identyczny podpis. Jest to jednak tylko deklaracja - musisz utworzyć instancję delegata, zanim będziesz mógł go użyć. Instrukcja podana poniżej pokazuje, jak można utworzyć wystąpienie delegata zadeklarowanego powyżej.

MyDelegate d = new MyDelegate (ShowText);

Po zadeklarowaniu i utworzeniu wystąpienia delegata można łatwo wywołać metodę, na którą delegat wskazuje.

d ("Witaj świecie ...");

Tutaj d jest instancją delegata

Można również wywołać metodę wskazywaną przez instancję delegata przy użyciu metody Invoke () w instancji delegata, jak pokazano poniżej.

d.Invoke ("Hello World ...");

Jeśli masz metodę, która akceptuje dwie liczby i chcesz je dodać i zwrócić sumę dwóch liczb, możesz użyć delegata do przechowywania wartości zwracanej metody, jak pokazano we fragmencie kodu podanym poniżej.

int wynik = d (12, 15);

Oto pełna lista kodów w celach informacyjnych.

using System;

namespace Delegates

{

    delegat publiczny int MyDelegate (int x, int y);

    Program zajęć

    {

      static int Sum (int x, int y)

        {

            return x + y;

        }

        static void Main ()

        {

            MyDelegate d = new MyDelegate (suma);           

            int wynik = d.Invoke (12, 15);

            Console.WriteLine (wynik);

            Console.ReadLine ();

        }

    }

Delegaci w akcji w C #

Oto pełna lista kodów.

using System;

namespace Delegates

{

    delegat publiczny void MyDelegate (tekst ciągu);

    Program zajęć

    {

        public static void ShowText (tekst ciągu)

        {

            Console.WriteLine (tekst);

        }

        static void Main ()

        {

            MyDelegate d = new MyDelegate (ShowText);

            d ("Witaj świecie ...");

            Console.ReadLine ();

        }

    }

}

Należy pamiętać, że można przypisać wiele obiektów do wystąpienia delegata za pomocą operatora +, co powoduje, że delegat jest delegatem multiemisji. Możesz również łączyć wystąpienia delegatów przy użyciu metody statycznej Combine.

Środowisko wykonawcze przechowuje wewnętrznie listę (nazywaną również listą wywołań) w celu wykonywania wielu metod. Poniższy wykaz kodu pokazuje, jak można użyć metody Combine () do łączenia wielu wystąpień delegatów.

myDelegate d1 = new myDelegate (Method1);

myDelegate d2 = new myDelegate (Method2);

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

multicastDelegate.Invoke ();

Delegat, który może wskazywać wiele metod, jest nazywany delegatem multiemisji. Należy pamiętać, że wystąpienia delegatów są niezmienne. Dlatego podczas łączenia delegatów lub odejmowania jednego wystąpienia delegata z listy tworzone jest nowe wystąpienie delegata reprezentujące zaktualizowaną lub nową listę obiektów docelowych lub metod do wywołania.

Delegaci multiemisji w akcji w języku C #

Poniższa lista kodu ilustruje delegata multiemisji. Zwróć uwagę na użycie instancji delegata: tutaj użyliśmy operatora + =, aby przypisać delegata do wielu metod, które mają identyczne podpisy.

using System;

namespace Delegates

{

    delegat publiczny void MyDelegate ();

    Program zajęć

    {

        public static void Method1 ()

        {

            Console.WriteLine ("Inside Method1 ...");

        }

        public static void Method2 ()

        {

            Console.WriteLine ("Inside Method2 ...");

        }

        static void Main ()

        {

            MyDelegate d = null;

            d + = Metoda1;

            d + = Metoda2;

            d.Invoke ();

            Console.ReadLine ();

        }

    }

}

Delegaci idealnie nadają się do wdrażania programowania sterowanego zdarzeniami. Delegat nie musi znać klasy obiektu, do którego się odnosi. Wszystko, co musi wiedzieć, to podpis metody, na którą ma wskazywać. Prawidłowe użycie delegatów może promować możliwość ponownego wykorzystania w kodzie i elastyczność w projektach. Więcej informacji na temat delegatów można znaleźć w dokumentacji online firmy Microsoft.