funkcje anonimowe

0

Witam,
Ogolnie rozumiem tak, ze funkcje anonimowe to takie funkcje, ktore nie maja nazwy. W skrocie, program wchodzi w blok, opcjonalnie pobiera jakies argumenty.

Rozumiem, ze closure / funkcja anoninowa jest taka, ze jest tworzona i wykonywana dopiero w momencie wejscia w blok. Rownie dobrze moze zostac zastapiona delegatem / wskaznikiem na oddzielnie zdefiniowana funkcje, ale czesto sie to nie oplaca, szczegolnie dla krotkich funkcji lub takich, ktore beda uzywane tylko w jednym miejscu.

Dobrze rozumiem?

0

Standardowy przykład to Visual Studio + jakiś wyklikany w designerze button masz

public void button_OnClick( object sender, eventArgs args)
{
   label.Text = "Dziaua"
}

public void Inicjalizacja()
{
    buttton1.Click += button_Onclick;
}

Dodasz 5 takich metod i masz zaśmiecony kod, a nieraz chcesz coś trywialnego i wtedy skorzystasz z funkcji anonimowych...

public void Inicjalizacja()
{
    button1.Click += (sender, args) => label.Text = "dziaua";
}

Zaoszczędzasz kilka linii kodu + nie zaśmiecasz sobie klasy metodą która nie będzie używana w innym przypadku.

0

Ok, rozumiem to troche jak komparatory liczb (np. do quicksorta, aby wstawic w miejscu gdzie jest wskaznik / delegat i miec krotszy kod). Jest to jednak cos co zawsze da sie zrobic normalna funkcja. Zastanawiam sie nad praktycznym przykladem funkcji anonimowej, tzn. cos co bardzo brzydko rozwiazac klasycznym wskaznikiem, a w jakis fajny sposob robi cos co nie da sie po prostu zrobic wskaznikiem na zewnetrzna metoda, badz masakruje to kod. Bo to jest troche i jak cukierek skladniowy: krotszy i czytelniejszy kod. A mozna z tymi funkcjami anonimowymi zrobic cos wiecej niz tylko skrocic program?

0

Poprzedni post to bylem ja, zmeczenie, przepraszam.

0

Nie da się zrobić więcej. Funkcja anonimowa to mniej niż normalna funkcja... bo nie ma nazwy. Tyle.

public TimeSpan Wiek( Osoba osoba ) 
{
   return DateTime.Now - osoba.DataUrodzenia;
}

public PosortujPoWieku(List<Osoba> osoby)
{
    return osoby.Sort(Wiek);
    return osoby.Sort(delegate(Osoba osoba) { return DateTime.Now - osoba.DataUrodzenia; };
    return osoby.Sort((Osoba osoba) => { return DateTime.Now - osoba.DataUrodzenia; })
    return osoby.Sort(osoba => DateTime.Now - osoba.DataUrodzenia);
}

Chodzi o skrócenie zapisu i zyskanie na czytelności. Piszesz jednolinjkową, prostą i jednorazową funkcję to po co Ci nazwa do tego? ;) Głównie przydaję się przy zdarzeniach, callbackach, komparatorach.

0

Aha, a zaletą może być opcja uwiązania zmiennej np.

public int Metoda()
{
   int zmiennaLokalna;

   // ...
   button.OnClick += (o, e) => label.Text = zmiennaLokalna.ToString(); // Pomimo, że nie jest ona przekazana masz do niej dostęp.
}
0
asasasdas napisał(a):

Bo to jest troche i jak cukierek skladniowy: krotszy i czytelniejszy kod.

Niemalże wszystko powyżej asemblera to cukier składniowy.

0

Funkcja Anonimowa to tylko przyśpieszenie pisania kodu przez programistę.
Jest to po prostu funkcja która nie posiada nazwy i pełnej deklaracji.
Na etapie kompilacji do kodu pośredniego jest przekształcana na zwykłą funkcję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1