Strona główna » Kursy » Kurs C# » Delegaty
 

Delegaty

Wstęp

Delegaty pozwalają wywołać pewną określoną metodę, albo kilka. Muszą one jednak przyjmować te same argumenty i zwracać ten sam typ danych. Innymi słowy delegaty to bezpieczny typ wskaźnika na metodę. W tym artykule zostanie wyjaśnione jak z nich korzystać i kiedy mają zastosowanie.

Delegaty

Delgaty to bezpieczne wskaźniki na metodę zapisaną w pamięci w komputera. Można ich używać kiedy zaistnieje potrzeba zmiany zachowania programu np. kalkulatora. Domyślnie są one używane w aplikacjach okienkowych, gdzie kliknięcie w przycisk wywołuje odpowiednią metodę. Warto wiedzieć, że pojedynczy delegat może wywołać wiele metod równocześnie, ale ma to ograniczenia dotyczące argumentów.

Implementacja

Metody

Dane są dwie metody, które zostaną wykorzystane przy tworzeniu prostego kalkulatora. Nie zwracają żadnych danych, a od razu wypisują wynik na ekran. Oto ich przykładowa implementacja:

  1. public static void Dodaj(int a, int b)
  2. {
  3. Console.WriteLine("{0} + {1} = {2}", a, b, a + b);
  4. }
  1. public static void Odejmij(int a, int b)
  2. {
  3. Console.WriteLine("{0} - {1} = {2}", a, b, a - b);
  4. }

Jak można zauważyć obie metody przyjmują dwa takie same argumenty, a więc jest możliwe utworzenie dla nich delegata.

Delegat

Przed utworzeniem obiektu, który będzie delegatem należy utworzyć jego prototyp. Jest to niemalże identyczne z sposobem deklaracji nowej metody. Oto skrócony zapis deklarcji prototypu:

  1. [dostęp] delegate [zwracany_typ] [nazwa]([argumenty]);

Chcemy utworzyć delegata o nazwie Oblicz, który będzie przyjmował dwie liczby całkowite jako argumenty. Dodatkowo należy zaznaczyć, że wywołana metoda nie zwróci żadnej wartości.

  1. Oblicz metoda = new Oblicz(Dodaj);
  2. metoda(a, b);

Prototyp delegata należy umieścić wewnątrz klasy, albo wewnątrz przestrzeni nazw. Warto zauważyć, że nazwy argumentów moge być inne niż w metodach, ponieważ liczy się zgodność typów kolejnych argumentów.

Wywołanie Delegata

Delegata tworzy się jak obiekt: wpierw podaje się typ tj. ustaloną nazwę delegata w prototypie oraz nazwę zmiennej. Od tej pory do delegata uzyska się dostęp poprzez zmienną. Oto szkic deklaracji:

  1. [nazwa_delegatu] [nazwa] = new [nazwa]([metoda]);

Podczas tworzenia delegata jako argument nowego obiektu podajemy metodę, która ma zostać przez niego wywołana. Nie jest obowiązkowe przypisywanie mu od razu wartości, ale inaczej będzie on pusty. Delegata wywołujemy tak samo jak funkcję, ale odwołujemy się do niego poprzez nazwę zmiennej. Oto przykład:

  1. Oblicz metoda = new Oblicz(Dodaj);
  2. metoda(a, b);

Chcąc teraz zmienić wywoływaną metodę wystarczy przypisać zmiennej nową funkcję i wywołać.

  1. metoda = Odejmij;
  2. metoda(a, b);

Oczywiście próba przypisania metody, której prototyp nie będzie odpowiadać typom argumentom funkcji jak również zwracanemu typu to zostanie zwrócony odpowiedni błąd.

Wywołanie Wielu Metod

Poprzednie przykłady dotyczyły przekierowania wywołania do pewnej konkretnej funkcji. Niemniej delegat może przechowywać wskaźnik na wiele metod. Oznacza to, że jednym wywołaniem można wykonać kilka różnych metod. Oto przykład:

  1. metoda = Dodaj;
  2. metoda += Odejmij;
  3. metoda(a, b);

Na konsoli pojawiły się wyniki obydwu działań co świadczy o poprawnym działaniu. Do metody dodającej metodę do delegata istnieje metoda usuwająca metodę z delegata. Dzięki temu można na bieżąco aktualizować listę wywoływanych metod.

  1. metoda -= Odejmij;
  2. metoda(a, b);

Podsumowanie

Delegaty pozwalają na bardzo wygodną pracę z metodami i warto z nich korzystać za każdym razem, gdy jest taka możliwość. Należy jednak pamiętać, aby ich nie nadużywać, ponieważ może to zmniejszyć czytelność kodu.

Zadania

Zadanie 1

Napisz program z wykorzystaniem delegatów, który będzie służył do wykonania pewnej operacji matematycznej na dwóch liczbach. Użytkownik w kolejnych linijkach będzie wpisywać, albo dwie liczby, albo znak operacji matematycznej do wywołania. Program powinien obliczać wyrażenie na bieżąco wypisując znak równa się i wynik.

  1. +
  2. 5 7
  3. = 12
  4. 3 2
  5. = 5
  6. -
  7. 9 8
  8. = 1