C# – Delegate
Wyobraź sobie, że chcesz zadeklarować zmienną, która odwołuje się do metody, a więc nie jest zmienną do trzymania liczby całkowitej, lub ciągu znaków lub dowolnego obiektu jakiejś klasy. Kiedy deklarujesz zmienną która wskazuje na metodę, to oznacza, że będziesz mieć zmienną, która zawiera kod wykonywalny, i możesz wywołać zmienna tak jak byś wywołała metodę za pomocą nawiasów i opcjonalnie możesz przekazać kilka argumentów. Aby to zadziałało, musisz utworzyć typ delegat, więc delegat jest typem, używaliśmy już słowa kluczowego class, aby utworzyć typ, lub słowo kluczowe struct, aby utworzyć typ, jest tez słowo kluczowe delegate w język C#, a to słowo kluczowe pozwoli mi utworzyć typ, który jest dedykowany do odwoływania się do metod, a to oznacza, że definicja typu dla delegata wygląda inaczej niż definicja klasy.
Definicja typu Delegate wygląda prawie jak definicja metody, definicja typu opisuje metody, które chcę wywołać.
W tym fragmencie kodu tworzymy delegata o nazwie Writer. Wiemy, że to jest delegat, ponieważ widzimy słowo kluczowe delegate, a zmienna tego typu wskazuje na metodę, która zwraca void i pobiera parametr typu string. Nie ma tutaj nawiasów klamrowych, nie definiuję metody z kodem wykonywalnym, definiuje delegat i kończę instrukcję średnikiem. Definiuję typ, którego można użyć do tworzenia zmiennych które wskazują na metode/y, które mają ten sam podpis i ten sam typ zwracany. Np. metoda WriteMessage()
Nazwa tego typu to Writer.
Teraz wyobraź sobie, że mam klasę o nazwie Logger. I Możemy utworzyć Logera, a kiedy mam Logger, możemy wywołać metodą WriteMessage, a Logger może zrobic coś ciekawego, jak naprzykład wydrukować wiadomość na ekranie.
Mogę również napisać trochę kodu, który tworzy instancję Logera, a następnie tworzymy delegat i przypisujemy mu metodę która ma być wykonana WriteMessage() a nastepnie wywołujemy delegat do którego przekazujemy tekst.
To właśnie robi ten fragment kodu.
Uwaga
Nie wywołuję programu logger.WriteMessage, po WriteMessage nie ma nawiasów,
ten kod jest dosłownie tworzeniem nowej instancji delegata i przekazaniem metody WriteMessage temu delegatowi.
Ten delegat jest zapisany w zmiennej o nazwie Writer i mogę teraz wywołać logger.WriteMessage po prostu wywołując tę zmienną writer, wszystko, co muszę zrobić, to zastosować nawiasy do zmiennej i przekazać parametr.
Delegat Writer będzie pracował tylko z tymi metodami które zwracają void i pobierają jeden parametr typu string. Zauważ, że nazwa metody nie ma znaczenia, mogę mieć delegate który nazywa się Writer i odwołuje się do metody o nazwie WriteMessage lub dowolnej innej nazwy tak długo, jak ta metoda zwraca void i pobiera parametr typu string.
Przejdzmy do Visual Studio i zobaczmy to w praktyce, aby stało się to bardziej jasne, całościowe omówienie tematu Delegat dostępne jest na kursie:
https://dev-hobby.pl/kursy/c-podstawy-programowania/
Cały kod do kursu na githubie:
Nie wiem czy wiesz ale tworzysz bardzo ciekawe i inspirujące treści. Trzymaj dalej tak wysoki poziom, a już wkrótce osiągniesz szczyty wyszukiwarek na topowe frazy 🙂