Использовать Func <> (или Action <>) или создать собственный делегат?

Какой из них лучше, например, в типе параметра в методе (не связанном с LINQ). По-видимому, Func лучше, поскольку он более простой, более описательный, и если все это используют, все станет совместимым (хорошим). Однако я замечаю, что Microsoft использует свой собственный делегат в некоторых библиотеках, например обработчиках событий. Итак, каковы преимущества и недостатки любого из них? когда я должен его использовать?

Редактирование:

  • По-видимому, Func <> доступен только в 3.5, так что это может быть основной причиной того, что я видел делегатов, отличных от Func. Любая другая причина не использовать Func? (пример: this > от .NET4)

  • Тот же вопрос также относится к Action <>

5 ответов

Func <> полезен, когда он очень четко определяет, для чего они используются, и количество входов невелико.

Когда количество входов больше или может быть какая-то двусмысленность над намерением, то использование делегата с именованными аргументами делает вещи более ясными.


Они для всех целей одинаковы, за исключением случаев, когда метод имеет параметр Expression. Они должны быть определены как "лямбда", а не delegate. Это было бы очень проблематично при работе с IQueryable и при вызове IEnumerable вызывается/разрешалось (например, LINQ2SQL).


Func <> и Action <> являются предпочтительными, если они действительно подходят в вашем случае. Runtime создает экземпляры каждого типа, используемые в вашей программе, и если вы используете Func, как только это означает, что экземпляр типа был создан. В случае пользовательского делегирования все происходит по-разному, и новые типы будут созданы, хотя они по существу похожи на существующие.

Однако иногда пользовательские делегаты делают код более понятным.


Однако я заметил, что Microsoft использует свой собственный делегат в некоторых библиотеках, например обработчиках событий. Итак, каковы преимущества и недостатки любого из них? когда я должен его использовать?

Некоторые из них исторические: API, определенные до С# 3/.NET3, когда были добавлены Action<> и Func<>. Для событий EventHandler - лучший выбор для событий, потому что он обеспечивает правильное соглашение.


Вы всегда можете создать класс, который содержит n число входных данных в качестве свойств класса и передать объекту класса один вход в функции func <> delegate

licensed under cc by-sa 3.0 with attribution.