Делегаты и интерфейсы в C#
Делегаты:
- Делегаты являются ссылочными типами, поэтому они выделяют весь объект только для ссылки на метод.
- Делегаты быстрее всего звонят, когда вы знаете все типы параметров во время компиляции.
- Делегаты позволяют использовать анонимных делегатов, которые действительно упрощают создание однострочных или очень маленьких делегатов.
- Делегаты могут ссылаться на частный метод без необходимости создания нового типа.
Интерфейсы:
- Интерфейсы не выделяют новые объекты, поэтому их быстрее получить.
- Интерфейсы быстрее для одноразовых приложений, так как вместо двух создается только один объект.
- Если хорошо спроектированы, интерфейсы допускают использование общих (нетипизированных) приложений, которые быстрее, чем DynamicInvoke делегатов.
- Если хорошо спроектированы, общие интерфейсы могут получить доступ к нетипизированному интерфейсу, который имеет одинаковые методы и параметры сигнатуры, только изменяя параметры типового типа по объекту.
- Интерфейсы позволяют использовать разные возможности вызова (например, Convert и TryConvert).
- Интерфейсы немного медленнее для вызова с правильно введенными параметрами.
- Интерфейсы не поддерживают анонимную компиляцию.
- Интерфейсы требуют создания всех типов, даже если необходим один метод.
Дизайн делегата может быть лучшим выбором, чем дизайн интерфейса, если выполняется одно или несколько из этих условий:
- Интерфейс определяет только один метод.
- Требуется многоадресная передача.
- Абоненту необходимо реализовать интерфейс несколько раз.