Может ли кто-нибудь дать хорошее объяснение (надеюсь, с примерами) этих 3 самых важных делегатов:
- сказуемое
- действие
- Func
Predicate
по существу Func<T, bool>
; задает вопрос "удовлетворяет ли указанный аргумент условию, представленному делегатом?" Используется в таких вещах, как List.FindAll.
Action
: Выполнить действие с учетом аргументов. Очень общее назначение. В LINQ мало используется, так как в основном это подразумевает побочные эффекты.
Func
: Широко используется в LINQ, обычно для преобразования аргумента, например, путем проекции сложной структуры на одно свойство.
Другие важные делегаты:
EventHandler
/ EventHandler<T>
: Используется во всех WinForms
Comparison<T>
Как IComparer<T>
в делегатской форме.
System.Converter<TInput, TOutput>
, хотя это редко используется.EventHandler/EventHandler<T>
появляются повсюду за пределами WinForms тоже.Action
,Func
ИPredicate
все они принадлежат к семейству делегата.Action
: Действие может принимать n входных параметров, но возвращает void.Func
: Func может принимать n входных параметров, но всегда будет возвращать результат указанного типа.Func<T1,T2,T3,TResult>
здесь T1, T2, T3 - входные параметры, а TResult - его выходные данные.Predicate
Предикат также является формой Func, но он всегда возвращает bool. Простыми словами это оберткаFunc<T,bool>
.источник
В дополнение к ответу Джона, есть также
Converter<TInput, TOutput>
: По сутиFunc<TInput, TOutput>
, но с семантикой. Используется List.ConvertAll и Array.ConvertAll, но лично я его больше нигде не видел.источник
MethodInvoker - это метод, который могут использовать разработчики WinForms; он не принимает аргументов и не возвращает результатов. Он предшествует действию и до сих пор часто используется при вызове в потоке пользовательского интерфейса, поскольку BeginInvoke () и другие принимают нетипизированный делегат; хотя Действие будет так же хорошо.
Я также знал бы о ThreadStart и ParameterizedThreadStart; снова большинство людей заменит действие в эти дни.
источник
Predicate, Func и Action являются встроенными экземплярами делегатов .NET. Каждый из этих экземпляров делегата может ссылаться или указывать на пользовательские методы с определенной сигнатурой.
Делегат действия - экземпляры делегата действия могут указывать на методы, которые принимают аргументы и возвращают void.
Делегат Func - экземпляр делегата Func может указывать на метод (ы), которые принимают переменное число аргументов и возвращают некоторый тип.
Предикат - Предикаты похожи на экземпляры делегата func и могут указывать на методы, которые принимают переменное число аргументов и возвращают тип bool.
источник
Действие и функционал с лямбдой:
источник
Func более дружественен по отношению к LINQ, его можно передавать как параметр. (Точка-бесплатно)
Предикат не может, должен быть снова упакован.
источник
Простой пример об аргументах и о том, что возвращает каждый тип
Этот Func принимает два аргумента int и возвращает int.Func всегда имеет возвращаемый тип
В этом случае func не имеет аргументов, но возвращает строку
Это действие принимает два аргумента int и возвращает void
Этот предикат принимает один аргумент и всегда возвращает bool. Обычно предикаты всегда возвращают bool.
источник