Czy ktoś może podać dobre wyjaśnienie (miejmy nadzieję, przykłady) tych 3 najważniejszych delegatów:
- Orzec
- Akcja
- Func
Predicate
: zasadniczo Func<T, bool>
; zadaje pytanie „czy określony argument spełnia warunek reprezentowany przez delegata?” Używane w takich rzeczach, jak List.FindAll.
Action
: Wykonuje akcję, podając argumenty. Bardzo ogólny cel. Niewiele używany w LINQ, ponieważ zasadniczo oznacza to efekty uboczne.
Func
: Używany szeroko w LINQ, zwykle do transformacji argumentu, np. Poprzez rzutowanie złożonej struktury na jedną właściwość.
Inni ważni delegaci:
EventHandler
/ EventHandler<T>
: Używany we wszystkich WinForms
Comparison<T>
: Jak, IComparer<T>
ale w formie delegata.
System.Converter<TInput, TOutput>
, choć rzadko jest używany.EventHandler/EventHandler<T>
pojawiają się wszędzie poza WinForms.Action
,Func
APredicate
wszystkie należą do rodziny delegata.Action
: Akcja może przyjąć n parametrów wejściowych, ale zwraca void.Func
: Func może przyjąć n parametrów wejściowych, ale zawsze zwróci wynik podanego typu.Func<T1,T2,T3,TResult>
, tutaj T1, T2, T3 są parametrami wejściowymi, a TResult jest ich wynikiem.Predicate
: Predicate jest również formą Func, ale zawsze zwraca wartość bool. W prostych słowach jest to opakowanieFunc<T,bool>
.źródło
Oprócz odpowiedzi Jona jest też
Converter<TInput, TOutput>
: ZasadniczoFunc<TInput, TOutput>
, ale z semantyką. Używany przez List.ConvertAll i Array.ConvertAll, ale osobiście nie widziałem go nigdzie indziej.źródło
MethodInvoker to metoda, z której mogą korzystać programiści WinForms; nie przyjmuje żadnych argumentów i nie zwraca żadnych wyników. Poprzedza Action i nadal jest często używany podczas wywoływania wątku interfejsu użytkownika, ponieważ BeginInvoke () i inni akceptują delegata bez typu; chociaż Action będzie równie dobrze.
Byłbym również świadomy ThreadStart i ParameterizedThreadStart; znowu większość ludzi w dzisiejszych czasach zastąpi Akcję.
źródło
Predicate, Func i Action to wbudowane wystąpienia delegatów platformy .NET. Każde z tych wystąpień delegatów może odwoływać się lub wskazywać na metody użytkownika z określonym podpisem.
Delegat akcji - wystąpienia delegata akcji mogą wskazywać metody, które pobierają argumenty i zwracają void.
Delegat Func - wystąpienie delegata Func może wskazywać metody, które pobierają zmienną liczbę argumentów i zwracają określony typ.
Predykaty - predykaty są podobne do instancji delegatów func i mogą wskazywać metody, które pobierają zmienną liczbę argumentów i zwracają typ bool.
źródło
Action and Func z lambda:
źródło
Func jest bardziej przyjazny dla LINQ, można go przekazać jako parametr. (bez punktów)
Predykatu nie można, trzeba ponownie opakować.
źródło
Prosty przykład o argumentach i powtórzeniach każdego typu
Ta Func pobiera dwa argumenty int i zwraca int.Func zawsze zwraca typ
W tym przypadku func nie ma argumentów, ale zwraca łańcuch
Ta akcja przyjmuje dwa argumenty int i zwraca void
Ten predykat przyjmuje jeden argument i zawsze zwraca wartość bool. Ogólnie rzecz biorąc, predykaty zawsze zwracają wartość bool.
źródło