Delegaty

Temat wydaje się prosty w teorii i zastosowaniu, a jednak 🙂 Odbyłem w swojej karierze już kilka rozmów na stanowisko junior/middle .Net Developer i może na 1 z 10 nie padło to pytanie. Warto więc poznać podstawy 🙂

Jeżeli Twoja przygoda z programowaniem nie zaczęła się od C#, a jak w moim przypadku od języka C/C++ to dla łatwiejszego zrozumienia można porównać delegaty do wskaźników występujących w C/C++.

Trochę teorii, jak podaje książka(bardzo polecam!) K.Żydzik,T.Rak “C#6.0 i MVC5 Tworzenie nowoczesnych portalii internetowych”  są to:

Delegaty to obiekty, w których wywołuje się inne funkcje (przechowuje referencje do funkcji)(…). Delegat jest funkcją, która nie ma ciała, ale może wywoływać ciała innych funkcji.

WAŻNE:
delegaty od wskaźników z C/C++ różnią się tym, że za ich pomocą można wywołać metodę, ale JEDYNIE TAKĄ KTÓREJ SYGNATURA DOPOWIADA SYGNATURZE DELEGATU.


KOD

Według mnie teoria lepiej wygląda na przykładach, tak też będę starał się prowadzić wpisy na moim blogu, a więc przejdźmy dalej.

MODYFIKATOR delegate TYP nazwa ([lista_argumentow])

Wygląda dobrze, nieskomplikowane, ale do czego to w ogóle służy? Tak, to pytanie również sobie zadawałem na początku mojej przygody, a dziś postaram Ci się wyjaśnić jak można za ich pomocą uprościć kod źródłowy. Tak więc, aby nie rodzić kolejnych pytań, spójrzmy na poniższy kod.

public delegate int DelegatesArt(int x, int y)
class Program
{
	static void Main()
	{
	DelegatesArt addDelegate = (x,y) => x+y;
	DelegatesArt minusDelegate = (x,y) => x-y;

Okej, zdefiniowaliśmy dwa deleagty oraz dwa wyrażenia lambda. Co Nam daje taki zapis? Zobacz dalej.

public void DoSomething(int x,int y, DelegatesArt delArt)
{
	Console.WriteLine(del(x,y))
}

Jak widzisz powyżej, metoda przyjmuje dwa argumenty typu int oraz jeden DelgateArt- w tym całe sedno prostoty rozwiązania! W zależności czy chcemy dodać czy odjąć wartości x oraz y użyjemy wcześniej zdefiniowanych delegatow addDelegate lub minusDelegate. Piękne prawda? Decydujemy w chwili wywołania o tym co chcemy aby nasza funkcja zrobiła:)

Jest to bardzo prosty przykład, lecz można go dowolnie zmieniać i odkrywać zalety takiego podejścia.

Przy okazji omawiania następnych części języka omówię kolejne zastosowania delegatów, a jest ich dość dużo do omówienia.