C#. Delegates, Func, Action

Ну, есть ключевое слово delegate — это описание сигнатуры функции, т. е., её списка параметров и типа возвращаемого значения. Используется так:

Им можно пользоваться так:

С другой стороны, есть готовые, предопределённые сигнатуры функций (Func<TArg1, TArg2, ..., TResult> с возвращаемым значением, Action<TArg1, Targ2, ...> без). То есть, можно не определять делегат самому, а воспользоваться готовыми Func и Action. Аналогичный пример:

Если для вашей сигнатуры подходит Func или Action, особого смысла определять свой делегат нету. Или есть, если вы хотите дать своему делегату более подходящее имя, чем просто Func, и хотите подчеркнуть его семантику.

Существуют случаи, когда свой делегат всё же необходимо объявлять. Например, наличие out– и ref-параметров:

Для полноты, вот (надеюсь, полный) список вариантов, когда вам придётся объявлять делегат:

  • Когда список аргументов чересчур длинный (для .NET 4+ более 16 аргументов, для .NET 3.5 больше 4 аргументов)
  • Когда ваши аргументы содержат refout или params.
  • Если ваш делегат рекурсивен (например delegate D D(D d)). Как ни странно, такие штуки иногда нужны.
This entry was posted in C#. Bookmark the permalink.