Delegaty i wyrażenie Lambda w C# - Wersja do druku +- SafeGroup (https://safegroup.pl) +-- Dział: Forum ogólne (https://safegroup.pl/forum-6.html) +--- Dział: Programowanie - języki i technologie (https://safegroup.pl/forum-34.html) +---- Dział: C#, VB, VC++ .NET (https://safegroup.pl/forum-38.html) +---- Wątek: Delegaty i wyrażenie Lambda w C# (/thread-10343.html) |
Delegaty i wyrażenie Lambda w C# - chomikos - 02.05.2016 W tym poście postaram się wytłumaczyć czym są delegaty, anonimowe delegaty (równoważne z wyrażeniem lambda, które jest bardzo przydatne w wielu wypadkach.) 1. Delegaty
Delegaty są podobne do wskaźników i funkcji w C czy C++. Z definicji – delegat to zmienna będąca odniesieniem do innej, przy czym „odniesienie” można zmieniać. Stwórzmy przykładowy delegat: Kod: delegate int NumberOperation(int x, int y); Otrzymaliśmy dzięki temu delegat, który zadziała dla każdej operacji, która zwraca typ int oraz ma dwa parametry (w tym przypadku też typu int). ]Delegaty, aby można było ich użyć, musimy „utworzyć”, czy też zadeklarować. Robimy to w ten sam sposób co klasy, struktury etc. Kod: NumberOperation adder = new NumberOperation(Add); Kod: int x = Add(1,2); oraz[/font] Kod: int x = adder(1,2); jest równoważny. Przykładowo taki program: Kod: using System; da nam takie wyjście: Przejdźmy teraz do ciekawej własności delegatów, to znaczy, da się je do siebie dodawać, odejmować etc. Trzeba zauważyć, że gdy je „dodajemy” etc. zmienia się ich wartość, stara jest usuwana. Przykładowo, dla kodu: Kod: using System; otrzymamy następujące wyjście: Teraz, gdy wiemy już czym jest delegat, chciałbym omówić inny jego wariant – anonimowy delegat, czyli funkcję bez nazwy. Będzie to świetny wstęp to wyrażenia Lambda. 2. Wyrażenie lambda Anonimowych delegatów używa się przy eventach, tzn. przy wydarzeniach podczas pracy programu. Dla przykładu, stworzyłem prostą aplikację WPF z jednym przyciskiem, który po naciśnięciu wyświetla okienko z napisem „Hello World!”. Kod: using[...] Teraz przejdziemy do użycia delegatów jako metod anonimowych. Usunę teraz funkcję Button_Click i zastąpię ją anonimowym delegatem – funkcją, która nie ma nazwy! Do zdarzenia button1.Click ‚dodaję’ delegat, zawierający właśnie tę funkcję. Kod: using[...] Jak widać, przy słowie kluczowym delegate mamy, identyczne jak w usuniętej przeze mnie funkcji operatory – object s, RoutedEventArgs e. Są one wymagane przez kompilator, bo domyślnie Button_Click też ich potrzebował.[ Z tymi wiadomościami możemy przejść do wyrażenia Lambda. Kod: using [...] Na pierwszy rzut oka to co tu widzimy może zdawać się niezrozumiałe, jednak gdy się temu przyjrzymy, zaczyna nabierać sensu. Analogicznie jak we wcześniejszym przykładzie do eventu button1.Click dodajemy jakieś wyrażenie. Tylko jakie? (s, e). Czym ono jest? Spójrzmy na parametry w poprzednim przykładzie – (object s, RoutedEventArgs e). Łatwo zauważyć analogię i domyślić się, w jaki sposób to działa. Kompilator wie co z tym zrobić, gdyż zna definicję eventu Click. Później, dzięki =>parametry te są przekazywane do wykonywanego kodu. Co w związku z tym? Wyrażenie lambda może być wykorzystywane między innymi do funkcji anonimowych, tzn. delegatów. Teraz, przejdźmy do wyrażenia lambda w LINQ (Language Integrated Query). Na początku trochę o LINQ – wspomaga bardzo sortowanie, grupowanie i wiele innych operacji, znacząco skraca kod. Kod: using [...] Co tu się dzieje? Na początku widzimy, została zadeklarowana tablica liczb values z różnymi wartościami. Nastepnie została stworzona lista zawierająca typ int o wiele sugerującej nazwie – biggerThanFive. Do niej zostały przypisane wszyskie wartości z tablicy values, które były większe od pięciu – values.Where( n => n > 5)(Where to element LINQ). Później widzimy już bardzo standardowy kod – tworzony jest string, do którego przypisywana jest wartość każdego elemntu z listy biggerThanFive a następnie dzieje się to, co już wcześniej omówiliśmy. Delegat wyświetlający nam msgbox z wartością temp. To by było na tyle, mam nadzieję, że przekazałem to w całkiem zrozumiały sposób :3 RE: Delegaty i wyrażenie Lambda w C# - M'cin - 21.05.2016 Literówka w ostatnim akapicie, wyszło Ci z węgierska valuesz. Poza tym spoko . RE: Delegaty i wyrażenie Lambda w C# - Tajny Współpracownik - 21.05.2016 Wycentrowanie całego tekstu to fatalne stylistycznie rozwiązanie. Oczęta bolo. RE: Delegaty i wyrażenie Lambda w C# - chomikos - 22.05.2016 fixed RE: Delegaty i wyrażenie Lambda w C# - M'cin - 22.05.2016 Zmieniłeś błąd na błąd. Chyba miało być 'values z', a nie samo values. Wiem, czepiam się |