Delegat - obiekt, który "wie" jak wywołać metodę.  W C++ podobną właściwość pełni wskaźnik do funkcji. Potocznie też można powiedzieć, że jest to szkielet metody jak powinna ona wyglądać. Mówiąc szczegółowiej: posiada typy parametrów metody oraz jej typ zwrotny

delegate int Transformer (int x);

Transformer jest zgodny z każdą metodą, która posiada typ zwrotny int oraz jeden parametr typu int

Posługiwanie się delegatem: 

delegate int Transformer (int x);

class Test
{ 
    static int Square (int x) => x * x;
    static void Main()
    {
        Transformer t = Square;   // jest to skrócony zapis: Transformer t = new Transformer(Square);
        int result = t(3);       // t(3) skrócony zapis: t.Invoke(3)
        Console.WriteLine(result); // Wyświetli 9
    }
}

Delegaty posiadają zdolność multiemisji, czyli egzemplarz delegatu może się odnosić nie tylko do jednej funkcji. Łączenie delegatów wykonuje się za pomocą + i +=. A usuwanie - i -=. W skrócie jeśli wywołamy delegat nastąpi wywołanie wszystkich metod po kolei w jakiej zostały dodane. Jeśli delegat ma inny zwrotny niż void, wywołujący otrzymuje wartość zwrotną ostatniej wywołanej metody. Jednak wartości zwrotne poprzednich wartości są ignorowane. 

delegate int Transformer (int x);
class Test
{ 
    static int Square (int x) => x * x;
    static int GetNumber(int x) => x;
    static void Main()
    {
        Transformer t = Square;   // jest to skrócony zapis: Transformer t = new Transformer(Square);
        t += GetNumber;
        int result = t(3);       // t(3) skrócony zapis: t.Invoke(3)
        Console.WriteLine(result); // Wyświetli 3
    }
}


Uwaga:

Jeśli zastosujemy operator -= do zmiennej z jedną metodą jest równoznaczne z przypisaniem wartości null do tej zmiennej.


© 2024 - SkillsTest.pl | | Regulamin | Polityka Prywatnosci