Использовать Func <> (или Action <>) или создать собственный делегат?
Какой из них лучше, например, в типе параметра в методе (не связанном с LINQ).
По-видимому, Func лучше, поскольку он более простой, более описательный, и если все это используют, все станет совместимым (хорошим).
Однако я замечаю, что Microsoft использует свой собственный делегат в некоторых библиотеках, например обработчиках событий. Итак, каковы преимущества и недостатки любого из них? когда я должен его использовать?
Редактирование:
-
По-видимому, Func < > доступен только в 3.5, так что это может быть основной причиной того, что я видел делегатов, отличных от Func. Любая другая причина не использовать Func? (пример: this > от .NET4)
-
Тот же вопрос также относится к Action < >
Ответы
Ответ 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