Функциональный делегат без типа возврата

410

Все делегаты Func возвращают значение. Какие делегаты .NET могут использоваться с методами, возвращающими void?

Теги:

5 ответов

563
Лучший ответ

Все делегаты Func возвращают что-то; все делегаты Action возвращают void.

Func<TResult> не принимает аргументов и возвращает TResult:

public delegate TResult Func<TResult>()

Action<T> принимает один аргумент и не возвращает значение:

public delegate void Action<T>(T obj)

Action - самый простой, "голой" делегат:

public delegate void Action()

Там также Func<TArg1, TResult> и Action<TArg1, TArg2> (и другие до четырех аргументов). Все они (кроме Action<T>) новы для .NET 3.5 (определенные в System.Core).

  • 10
    К вашему сведению, следующая версия библиотеки базовых классов будет включать в себя типы Func и Action, которые поддерживают более четырех формальных параметров. Я не помню точно, насколько они большие.
  • 0
    Я этого не слышал, спасибо за внимание, Эрик!
Показать ещё 4 комментария
47

... не принимает аргументов и имеет возвращаемый тип void?

Я считаю, что Action является решением этого.

37

Все делегаты Func принимают по крайней мере один параметр

Это не так. Все они принимают хотя бы один аргумент типа, но этот аргумент определяет тип возврата.

Итак Func<T> не принимает никаких параметров и возвращает значение. Используйте Action или Action<T>, когда вы не хотите возвращать значение.

23

Попробуйте System.Func<T> и System.Action

  • 1
    Я не думаю, что 0 аргументов и тому подобное существуют в .Net 2.0.
  • 1
    Это странно: Func вообще не существует в .Net 2.0, хотя Predicate и Action существуют.
Показать ещё 2 комментария
0

Иногда вам нужно написать делегат для обработки событий, и в этом случае вы можете воспользоваться System.EvenHandler<T>, который неявно принимает аргумент типа object в дополнение ко второму параметру, который должен выводиться из EventArgs. EventHandlers вернут void

Я лично нашел это полезным во время тестирования для создания однократного обратного вызова в теле функции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню