Wpis z mikrobloga

#programowanie #csharp

Mogłby ktos mi wyjaśnic poniższy kod - a dokladniej o co chodzi z "=>"

private int GetNextId()
{
if (_pois.Count == 0)
return 1;
else
return _pois.Max (p => p.Id.Value) + 1;
}

albo tutaj

public double Lat
{
get { //cos }
set { _lang = value; RaisePropertyChanged(() => Lng);}
}
public duble _lng;
  • 21
  • Odpowiedz
@PanBaklazan: Co do reszty kodu masz w zasadzie prostego if-a. W else masz zwracane z jakiejś listy/kolekcji element, którego Id.Value jest największe.

Pod spodem masz właściwość - odpowiednik Javowego gettera/settera. W setterze masz zmianę _lang i odpalenie metody, która służy za wyzwolenie zdarzenia (eventu). Najprowdopodobniej jest to zdarzenie PropertyChanged.

Skoro lambda nie może być z var to weź Func. :>
  • Odpowiedz
@japer: no w tym drugim domyslilem sie ze pewnie chodzi o odpalenie eventu.... ale nie czailem zapisu "() => Lng"... teraz wiem chociaz ze to cos sie nazwa Lamnda i trzeb o tym poczytac ;P
  • Odpowiedz
@PanBaklazan: metody anonimowe, czyli bez nazwy i deklarowane inline. Gdy jedna metoda przyjmuję inną metodę jako argument możesz albo przekazać normalną metodę używając po prostu jej nazwy, albo zadeklarować metodę anonimową w postaci wyrażenia lambda. Wyrażenie lambda musi mieć pasującą sygnaturę. Na przykład, gdy metoda przyjmuje metodę o sygnaturze Func w kodzie to mogłoby wyglądać tak: string ProcessLine(string line, Func splitMethod) {...}. Oznacza to, że przekazywana metoda musi pzyjmować string jako
  • Odpowiedz
@phosphor-bronze: no i wlasnie do czego moge uzyc taka metode przekazana do unkcji jak tak narpawde przekazuje tylko wynik wykoanej funkjci... chyba ze nie do konca rozumiem... bo narazie mi to wyglada jak sztuka dla sztuki... przekazywanie czegos za zasadzie interferju rozumiem... ale te metody lambda sa dla mnie narazie mało logiczne
  • Odpowiedz
@PanBaklazan: No właśnie nie przekazujesz wyniku, tylko przekazujesz metodę, która jest wywoływana póżniej. Popatrz na przykład. Metodę nr 2 możesz wywołać wiele razy za każdym razem używając innej metody splitowania stringa. Np wyobraż sobie, że masz linie rozdzielone przecinkami, średnikami, albo np. musisz użyć wyrażenia regularnego albo chcesz podzielić na równe kawałki o długości 5 :) Dzięki przekazaniu funkcji masz wpływ na implementację metody.
  • Odpowiedz
no tak - czyli mi to wyglada nie poprostu imprementacje interfejsu z Javy. Deklaracja tego i przeslanie tego do metody by mogla wlasnie sie do tego odwolac... roznica taka ze tutaj sie przesyla sama metode... a tam cały interface gdzie mozna skorzystac z tej metody jak i innych...
  • Odpowiedz
@PanBaklazan: Masz rację. Teraz wyobraż sobie, że potencjalnych sposobów na jakie programista chce dzielić string może być np. 40 - i teraz używając interefejsów taki programista musiałby implementować 40 razy dany interfejs. W tym przypadku łatwiej użyć metod anonimowych. Można to potraktować jako taki interfejs tylko z jedną metodą i implementacją inline :)
  • Odpowiedz
@PanBaklazan: Możliwe, nie znam Javy. Głównym powodem wprowadzenia wyrażeń lambda do C# było powstanie LINQ w C# 3.0. Inaczej walory użytkowe LINQ byłby bardzo mocno ograniczone. W ogóle notacja lambda pochodzi z języków funkcyjnych (Scala, F# etc) i tam jest to szeroko używany idiom.
  • Odpowiedz