#10 Delegaty.

Delegaty to utworzone przez nas typy danych za pomocą których „wskazujemy” na odpowiednie metody które mają zostać wykonane w danym momencie. W tym momencie ktoś może powiedzieć, że można to zrobić korzystając z instrukcji warunkowych i ma rację, Delegaty są jednak lepsze przy bardziej rozbudowanych projektach. Moim zdaniem po bliższym poznaniu delegatów są one lepszym rozwiązaniem.

Spróbuję wytłumaczyć to bardziej szczegółowo. Wyobraź sobie taką sytuację, że podczas działania programu użytkownik może podjąć decyzję co do dalszego działania tego programu np. mamy program który realizuje podstawowe zadania kalkulatora.  Podajemy dwie liczby i możemy wybrać działanie jakie na zostać wykonane na tych dwóch liczbach. W momencie wyboru działania program nie wie jakie działanie wybierze użytkownik. To użytkownik podejmuje decyzję o wyborze działania i tutaj właśnie możemy użyć delegatów. Za ich pomocą możemy (w zależności od wyboru użytkownika)powiedzieć programowi która metoda powinna zostać wykonana.

Przykład deklaracji delegata:

public delegate int typDelegata = (int a);

Jak widać w powyższym przykładzie delegata deklarujemy przy pomocy słówka delegate. Zadeklarowaliśmy delegata o typie int z jednym parametrem także o typie int.

Ponadto możemy stworzyć obiekt o typie delegata, przykład poniżej.

typDelegata mojObiekt = new typDelegata(metoda1);

Jak widzimy w powyższym przykładzie stworzyliśmy obiekt o nazwie „mojObiekt” o typie „typDelegata” i jak parametr dodaliśmy nazwę metody do wykonania „metoda1”.

Dla pełnego zobrazowania działania naszego delegata prezentuję poniżej pełny kod programu.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Konsola
{
    class Program
    {
        public delegate int typDelegata (int a);
        static int metoda1(int a)
        {
            return a;
        }
        static int metoda2(int a)
        {
            return a + 10; ;
        }
        static void Main(string[] args)
        {
            typDelegata mojObjekt = new typDelegata(metoda1);

            Console.WriteLine("Wynik działania metody 1: " + mojObjekt(10));

            mojObjekt = metoda2;

            Console.WriteLine("Wynik działania metody 2: " + mojObjekt(10));

            Console.ReadKey();

        }
    }
}

Program jest bardzo prosty ale prezentuje działanie delegatów. Zadeklarowałem na samym początku delegata o nazwie „typDelegata” oraz dwie metody o nazwach „metoda1” i „metoda2”. Pierwsza metoda zwraca wartość parametru, a druga zwraca wartość parametru powiększonego o 10. W metodzie „Main” tworzymy obiekt „mojObiekt” i przypisujemy do niego metodę „metoda1”. Następnie na wyrzucamy na ekran konsoli wynik działania metody1, gdzie jako parametr delegata podajemy wartość 10. Następnie „łączymy” delegata z metodą2, gdzie jako parametr delegata podajemy wartość 10  i wyrzucamy na ekran konsoli efekt działania metody 2. Na ekranie powinniśmy otrzymać wynik jak poniżej.

Wynik działania metody 1: 10
Wynik działania metody 2: 20

I wszystko się zgadza metoda 1 miała nam zwrócić wartość parametru, czyli liczbę 10 a metoda 2 miała nam zwrócić wartość parametru powiększonego o 10, czyli wartość 20.