Programowanie w języku C#

Delegacje

  • 2010-02-16 10:46
  • 5 komentarzy
  • 11412 odsłon
  • 2/6

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.

5 komentarzy

ArtystaCS_ 2015-09-09 01:02

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.

Brak avatara
Darko 2014-04-29 09:21

Wg mnie przedstawione zrozumiale. Mój wykładowca, chcąc nam wytłumaczyć delegaty na chłopski rozum, powiedział, że są to listy zmiennych typu "funkcja" :P

Brak avatara
Członek 2014-03-26 13:24

Właśnie miałem pisać, że mega tragicznie przedstawione, ale ktoś mnie uprzedził ;d

Brak avatara
Anonim 2013-11-22 14:51

I po przeczytaniu tego dalej gówno wiadomo.

hubertuss 2013-11-20 21:47

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