class my_class
{
public int add_1(int a, int b) {return a + b;}
public func<int, int, int> add_2 = (a, b) => {return a + b;}
}
add_1 - это функция, тогда как add_2 является делегатом. Однако в этом контексте делегаты могут выполнять аналогичную роль.
Из-за прецедента и дизайна языка выбор по умолчанию для методов С# должен быть функциями.
Однако оба подхода имеют свои плюсы и минусы, поэтому я подготовил список. Есть ли еще какие-либо преимущества или недостатки для любого подхода?
Преимущества для обычных методов.
- более обычный
- внешние пользователи функции видят именованные параметры - для синтаксиса add_2 arg_n и типа обычно недостаточно информации.
- работает лучше с intellisense - ty Minitech
- работает с рефлексией - Minitech
- работает с наследованием - Эрик Липперт
- имеет "this" - ty CodeInChaos
- более низкие накладные расходы, скорость и память - количество Minitech и CodeInChaos
- не нужно думать о public\private в отношении как изменения, так и использования функции. - ty CodeInChaos
- менее динамично, разрешено меньшее, что не известно во время компиляции - CodeInChaos
Преимущества методов "типа типа делегата".
- более согласованные, а не функции-члены и члены данных, это всего лишь элементы данных.
- может внешне выглядеть и вести себя как переменная.
- Сохранение его в контейнере хорошо работает.
- несколько классов могут использовать одну и ту же функцию, как если бы это была каждая из функций-членов, это было бы очень общим, кратким и имело бы хорошее повторное использование кода.
- легко использовать в любом месте, например, в качестве локальной функции.
- предположительно хорошо работает при передаче мусора.
- более динамичное, меньшее время должно быть известно во время компиляции, например, могут быть функции, которые настраивают поведение объектов во время выполнения.
- как бы инкапсулируя его код, можно комбинировать и перерабатывать, msdn.microsoft.com/en-us/library/ms173175%28v=vs.80%29.aspx
- внешние пользователи функции видят неименованные параметры - иногда это полезно, хотя было бы неплохо назвать их.
- может быть более компактным, в этом простом примере, например, возврат может быть удален, если есть один параметр, скобки также могут быть удалены.
- roll you'r собственное поведение, подобное наследованию, - Эрик Липперт
- другие соображения, такие как функциональные, модульные, распределенные, (написание кода, тестирование или рассуждение о коде) и т.д.
Пожалуйста, не проголосуйте, чтобы закрыть, вот что произошло, и оно снова открылось. Это правильный вопрос, даже если вы не думаете, что подход делегатов имеет много практического использования, учитывая, как он противоречит установленному стилю кодирования или вам не нравятся преимущества делегатов.