Strona główna > Przykłady > [C#] var, delegacje, metody anonimowe i wyrażenia lambda

[C#] var, delegacje, metody anonimowe i wyrażenia lambda

Artykuł ten w przystępny sposób przedstawia tytułowe zagadnienia osobie, która nie miała z nimi styczności.

Słowo kluczowe var

Deklarując zmienną musimy podać jej typ. Natomiast przy jej definicji możemy podać typ, ale możemy też skorzystać ze słowa kluczowego var.

int a; //deklaracja zmiennej typu integer
a=5; //inicjalizacja zmiennej

int b=6; //definicja i inicjalizacja zmiennej

var c=7; //utworzenie zmiennej typu integer za pomocą słowa kluczowego var

var d; //Error: An implicitly typed local variable declarator must include an initializer

Możemy pominąć typ tylko wtedy, gdy kompilator sam może go rozpoznać na podstawie jakichś danych.

var jest pomocne kiedy nie mamy ochoty zastanawiać się jaki typ zwraca jakaś funkcja.

var rezultat = NieWiemJakiTypZwracaTaFunkcjaINieMamOchotyZastanawiacSieNadTym();

Oczywiście w poważnym kodzie nie nadajemy tak długich nazw funkcjom’

var jest często stosowany w technologii LINQ, ale jest to temat na inny wpis.

Delagacje

W języku C# możemy tworzyć zmienne, które będą przechowywać liczby, znaki, łańcuchy znaków, tablice innych zmiennych, obiekty etc. A co gdybyśmy chcieli przechować gdzieś funkcję lub kilka funkcji? Z pomocą przychodzą nam delegacje.

Delegacje to obiekty, w których chowamy funkcje (dokładniej przechowujemy referencje do funkcji). Dla znających C++ – delegacje są podobne do wskaźników na funkcję. Pomocne może być takie wyobrażenie: delegacja jest funkcją, która nie ma swojego ciała, ale może wywoływać ciała innych funkcji.

Delegacje C# działają podobnie do delegacji w realnym świecie. Delegat może kogoś reprezentować, pełnić funkcję, której nie ma codziennie, ale teraz ma bo jest delegatem.

delegate int TypDelegacji(int a);

Nasza przykładowa deklaracja delegacji składa się ze słowa kluczowego delegate, zwracanego typu, nazwy delegacji oraz przyjmowanych argumentów. Nie jest to gotowa do pracy delegacja, a jedynie typ. Od teraz nazwa delegacji (u nas „TypDelegacji”) jest nazwą typu, którego możemy używać do tworzenia obiektów delegacji.

Dla dociekliwych: po napotkaniu takiej deklaracji delegacji kompilator C# tworzy klasę z modyfikatorem sealed, której nazwa jest identyczna jak nazwa danej delegacji. Klasa ta ma konstruktor, który przyjmuje jako argument nazwę metody. Zawiera ona także metody, które pozwalają danej delegacji na utrzymywanie i zarządzanie listą metod docelowych.

Deklaracja delegacji określa jakie metody będzie mógł przechowywać (fachowo – rejestrować) obiekt delegacji. Metoda taka musi mieć zgodną sygnaturę, tzn. musi zwracać taki sam typ i przyjmować takie same argumenty jakie podaliśmy w deklaracji delegacji.

private delegate int TypDelegacji(int a);

public static void Main (string[] args)
{
	TypDelegacji obiektDelegacji = new TypDelegacji(Kwadrat);
	//skrócona wersja: TypDelegacji obiektDelegacji = Kwadrat;
	Console.WriteLine (obiektDelegacji(5));
	Console.ReadKey();
}

private static int Kwadrat(int x)
{
	Console.WriteLine ("Wywołano metode Kwadrat");
	return(x*x);
}

W 1. linijce umieszczamy deklaracje delegacji. W linijce 5. tworzymy obiekt delegacji i rejestrujemy (chowamy) metodę Kwadrat, dzięki czemu w linijce 7. zostanie wywołana właśnie ta metoda.

Możemy zarejestrować kilka metod w delegacji.

obiektDelegacji += new TypDelegacji(InnaMetoda) //lub poprostu obiektDelegacji += InnaMetoda;
obiektDelegacji(10);

W linijce 2. zostaną wywołane wszystkie zarejestrowane metody.

Metody anonimowe

Metoda anonimowa to metoda, której dziwactwo polega na tym, że nie posiada swojej nazwy (dlatego jest „anonimowa”). Jednak nie możemy tego uważać za powód do dyskryminacji, bowiem oprócz braku przydomka jest całkiem normalna, tzn. może przyjmować argumenty i ma swoje ciało metody, w którym możliwe jest zwrócenie jakiejś wartości. Najłatwiej to zrozumieć przez przeanalizowanie prostego przykładu.

TypDelegacji obiektDelegacji = delegate(int x){
	Console.WriteLine("Wywołano metode anonimową");
	return(x*x);
};
Console.Writeln(obiektDelegacji(2));

Zamiast tworzyć metodę i dodawać ją do delegacji przez nazwę, stworzyliśmy metodę bez nazwy (ale ze słowem kluczowym delegate) i od razu ją zarejestrowaliśmy (czyli „schowaliśmy” w delegacji). Metodę tą będziemy mogli wywołać tylko korzystając z delegacji. Jest to bardzo wygodne rozwiązanie, kiedy szybko chcemy stworzyć i przekazać dalej krótką metodę.

Wyrażenia lambda

TypDelegacji obiektDelegacji = (int x)=>{
	Console.WriteLine("Wyrażenie lambda");
	return(x*x);
};
Console.WriteLine(obiektDelegacji(1337));

Powyższy przykład prezentuje wyrażenie lambda. Nie sposób oprzeć się słusznemu wrażeniu, że jedyne co musieliśmy zmienić w stosunku do poprzedniego przykładu, to zamiana delegate na symbol =>. Wyrażenia lambda pozwalają nam szybciej tworzyć anonimowe funkcje. Zapis wyrażenia może być jeszcze krótszy.

TypDelegacji obiektDelegacji = x => x*x;
Console.WriteLine("5*5 = "+obiektDelegacji(5));

Gdy funkcja (tzn. wyrażenie lambda) przyjmuje jeden argument nie musimy otaczać go nawiasami. Gdy w ciele funkcji mamy tylko jedną instrukcję, nie musimy korzystać z klamerek. Zrezygnowaliśmy też z return.

I to już wszystko. Jeśli znasz lambda, to jesteś już trv funkcyjnym programistą 😉 W przypadku niejasności tudzież ewentualnych błędów w artykule zachęcam do kontaktu.

Reklamy
Kategorie:Przykłady Tagi: , ,
  1. abi
    27 sierpnia 2011 o 3:02 pm

    fajne, przystepnie i dobre na start, moglbys w tym stylu opisac jeszcze Interface? Jak nie w arcie to komenatrzu moze? :))

    • 27 sierpnia 2011 o 4:04 pm

      @abi Dzięki 🙂 Postaram się napisać arta o interfejsach w wolnej chwili.

  2. Granat
    23 grudnia 2011 o 6:05 pm

    Bardzo pomocne. Proste i jasne.

    Dzięki Arvangen !!

  3. Prasoł
    3 marca 2012 o 3:27 pm

    Fajnie i wreszcie zrozumiale opisane.

  4. Dex
    30 marca 2012 o 12:42 am

    O stary, wykładowca na studiach nie potrafił tego przez rok wytłumaczyć a ty wyjaśniłeś mi to w 5 minut 😉

  5. Roher
    22 lutego 2013 o 10:54 pm

    Seper Pomocne, Wielkie dzięki:)

  1. 27 sierpnia 2011 o 7:59 am
  2. 27 sierpnia 2011 o 8:02 am

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s

%d blogerów lubi to: