C#

Delegacje

msm

Koncepcja delegacji w .NET

Czym właściwie są delegacje w języku C#? Najprościej można je zdefiniować jako wskaźniki do metod opakowane w klasę (Jako że C# jest językiem wysokopoziomowym i opiera się na idei kodu zarządzanego, używanie wskaźników jest niewskazane - a wskaźników do metod jako takich nie ma). Obiekt delegacji przechowuje listę metod które obsługuje. Rozwiązanie to jest ponadto bezpieczne, bo poprawność adresu metody jest sprawdzana za każdym razem (nie istnieje niebezpieczeństwo przetwarzania złego obszaru pamięci).

Przykłady delegacji

Deklarowanie

Deklaracja delegata wygląda podobnie jak sygnatura metod przez niego pobieranych z wstawionym przed nazwą zwracanego typu słowa delegate. Może i brzmi to skomplikowanie, ale tworzenie delegatów jest naprawdę proste.

        // Przykład deklaracji delegata - pobiera on jeden parametr
        // typu string i nic nie zwraca.
        private delegate void Foo(string param);
 
        // Ta metoda pasuje do sygnatury delegata.
        private void Metoda(string param) { }
 
        // Ta też - nazwa parametrów nie ma znaczenia.
        private void Metoda2(string s) { }
 
        // Ta już nie - nie zgadza się typ parametru pobieranego.
        private void Metoda3(int param) { }
 
        // Ta też nie - zwraca string zamiast void.
        private string Metoda4(string s) { }

Rejestrowanie metod

No więc mamy już klasę delegata. Utworzenie obiektu tej klasy jest raczej banalne...

Foo delegat = new Foo(Metoda); // To wywołanie jest równoważne...
Foo delegat = Metoda; // temu - kompilator traktuje je jednakowo.

A co jeśli chcielibyśmy dodać albo usunąć jakąś metodę? Służą do tego operatory += i -=.

            Foo delegat = Metoda;
            delegat += Metoda2;
            delegat -= Metoda;

Warto wspomnieć że operatory += i -= wywołują w tle (a właściwie są tym samym co) metody Combine i Remove klasy delegata.

Wywoływanie delegata

Wywoływanie delegata odbywa się identycznie jak metody.

delegat("parametr");

Spowoduje to wykonanie po kolei (synchronicznie) wszystkich zarejestrowanych metod (w kolejności ich dodawania). Jeśli delegacja będzie pusta (bez zarejestrowanych metod) otrzymamy w wyniku NullReferenceException.

C#

2 komentarzy

Idealnie wytłumaczone w końcu wiem o co chodzi. Profesorowi, który jak tłumaczy to tak jakby sam do końca tego wszystkiego nie rozumiał średnio to wychodzi. Moim zdaniem, jeśli potrafisz coś komuś dobrze wytłumaczyć to jest to równoznaczne, że znasz się na temacie.

Czy te funkcje Metoda, Metoda2, Metoda4 nie powinny być statyczne?