Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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