Delegat (CLI) – Wikipedia, wolna encyklopedia
Delegaty w języku C# wywodzą się ze wskaźników do funkcji używanych w językach C/C++. Jednak niedoskonałością wskaźników jest to, iż nie gwarantują bezpiecznego zwracania typów danych jak i liczby podawanych parametrów (oraz ich typów). .NET Framework stworzył dla programistów bardzo podobny mechanizm, który zyskał dodatkową funkcjonalność. W efekcie delegaty dbają o bezpieczeństwo typów zwracanych obiektów i metod, na które wskazują. Te nowe typy danych zawierają trzy ważne informacje:
- adres metody, na którą wskazują
- parametry tej metody
- oraz zwracany typ danej metody
Deklaracja
[edytuj | edytuj kod]Deklaracje delegatów tworzymy podobnie jak zwykłe funkcje, poprzedzając je jedynie słowem kluczowym delegate
// Delegat potrafiący wskazać na jakąkolwiek metodę posiadającą 2 parametry typu całkowitego i zwracającą typ int delegate int DelegatBin(int x, int y);
Delegaty mogą wskazywać tylko na funkcje o identycznych typach parametrów i typie zwracanym. Jeżeli chcemy wskazywać na metody np. typu char musimy stworzyć nowego delegata. Delegaty w języku C# są typami danych, które mogą zostać od razu zainicjowane. By tego dokonać musimy stworzyć obiekt delegatu i jako parametr podać nazwę funkcji, na którą ma wskazywać.
int funkcja(int x, int y) return x + y; //obiekt delegatu wskazujący na funkcję DelegatBin nowyDelegat = new DelegatBin(funkcja); //istnieje również taka możliwość przypisania nowyDelegat = innaFunkcja;
Prosty przykładowy program pokazujący wykorzystanie
class Program { delegate int DelegacjaM(int x, int y); static int Suma(int x, int y) { return x + y; } static int Roznica(int x, int y) { return x - y; } static void Main(string[] args) { DelegacjaM delegat = new DelegacjaM(Suma); Console.WriteLine("Dodawanie 50+50 " + delegat(50,50) );// zauważmy w tym miejscu że obiekt delegatu zostaje wywołany jak zwykła funkcja delegat = Roznica; Console.WriteLine("\nOdejmowanie 30-20 " + delegat(30,20) ); Console.ReadLine(); } }
Delegaty można wykorzystać do pisania metod-wtyczek. Zmienna delegatu może otrzymać wartość w czasie wykonywania programu. Temat ten jest kluczem dla odpowiedniego zrozumienia funkcjonowania zdarzeń.
Funkcje zwrotne
[edytuj | edytuj kod]Jako że delegaty są obiektami, nie ma problemu przy przesyłaniu ich jako parametrów innych funkcji.
public int FooBar(int x, int y, DelegatBin nowyDelegat) { return x + y + nowyDelegat(50, 60); }
Wówczas możemy wywołać funkcję, na którą wskazuje obiekt naszego delegatu w funkcji FooBar.
Delegaty złożone
[edytuj | edytuj kod]Do delegatu można przypisać więcej niż jedną funkcję, lecz wtedy podczas jego wywołania wywołane zostaną wszystkie te funkcje, które do niego przypisaliśmy. Do przypisywania bądź usuwania funkcji służą operatory += i -=.
Funkcje anonimowe
[edytuj | edytuj kod]Istnieje równie możliwość tworzenia funkcji anonimowych przy użyciu delegatów, co pozwala na przyśpieszenie projektowania poprzez pominięcie nazwy metody.
Foo MyFoo = delegate(string M) { Console.WriteLine(M); }; MyFoo("Hello World");
Bibliografia
[edytuj | edytuj kod]- Adam Boduch "Wstęp do programowania w języku C#" Wydawnictwo Helion
- Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson, Morgan Skinner "Professional C# 4 and .NET" Wrox
- Marcin Gościniak "Delegaty w C#"