Рекомендуем, 2024

Выбор редакции

Разница между делегатами и событиями в C #

Использование элегатов и событий играет важную роль в управляемой событиями программе. Делегаты могут ссылаться на метод, и он очень похож на указатель на функцию в C ++. События сообщают, что какое-то действие было выполнено. Основное различие между делегатами и событиями заключается в том, что делегаты содержат ссылку на методы, а событие обеспечивает способ доступа к этому методу с использованием делегатов.

Сравнительная таблица

Основа для сравненияДелегатыСобытия
основнойДелегат содержит ссылку на метод.Мероприятие представляет собой многоуровневую абстракцию, предоставляемую делегатам.
Синтаксисделегат return_type делегат_name (параметр-список);event event_delegate event_name;
Ключевое словоДелегат объявляется с использованием ключевого слова «делегат».Событие объявляется с использованием ключевого слова «событие».
декларацияДелегат объявляется вне любого класса.Событие объявлено внутри класса.
взыватьЧтобы вызвать метод, он должен быть передан делегату.Чтобы вызвать метод, он должен быть присвоен событию.
Ковариантность и КонтравариантностьОни обеспечивают гибкость для делегатов.Нет такой концепции.
Средство доступа к событиямНет такой концепции.Управляет списком обработчиков событий.
зависимостьДелегаты не зависят от событий.Событие не может быть создано без делегатов.

Определение делегатов

В C # делегаты используются как указатели на функции для ссылки на метод. Это конкретно объект, который ссылается на метод, который ему назначен. Один и тот же делегат может использоваться для ссылки на разные методы, поскольку он может содержать ссылку на разные методы, но по одному за раз. Какой метод будет вызван делегатом, определяется во время выполнения. Синтаксис объявления делегата следующий:

 делегат return_type делегат_name (параметр-список); 

Здесь return_type объявляет тип значения, возвращаемого методом, который вызывается делегатом, а имя-делегата - это имя делегата. Параметр_list определяет список параметров, необходимых для методов, которые будут вызываться делегатом.

Есть несколько важных моментов, которые следует помнить о делегатах. Он может вызывать любой метод, соответствующий его сигнатуре и типу возвращаемого значения. Делегат может вызывать как метод экземпляра, так и статический метод. Если он вызывает метод экземпляра, он должен воспользоваться помощью объекта для вызова метода. Делегаты поддерживают многоадресную передачу, т. Е. Вы можете объединить методы, которые будут автоматически вызываться при вызове ссылающегося на них делегата. Вам просто нужно создать объект делегата и назначить методы один за другим в цепочку, используя оператор «+ =». Вы также можете освободить метод, используя оператор «- =».

Функциями, которые добавляют делегату дополнительную гибкость, являются Ковариация и Контравариантность. Ковариантность и Контравариантность допускают условие, при котором тип возвращаемого значения и подпись метода, назначенного делегату, отличаются от сигнатуры делегата.

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

Определение событий

События - это выполняемое действие, которое изменяет состояние объекта. События объявляются с использованием делегатов, без присутствия делегатов вы не можете объявлять события. Вы можете сказать, что событие обеспечивает инкапсуляцию для делегатов. Есть два важных соединения при работе с событиями, которые являются обработчиками событий и событий. Если объекты заинтересованы в событии, то он регистрирует обработчик события для этого конкретного события. И всякий раз, когда события запускаются, вызываются зарегистрированные обработчики событий. Объявление события выглядит следующим образом:

 event event_delegate event_name; 

Здесь «событие» - это ключевое слово, которое показывает объявление события. Затем event_delegate показывает имя делегата, который поддерживает событие. Тогда event_name - это имя события

Есть некоторые важные моменты, которые следует помнить при работе с событиями. Подобно делегатам, события также могут быть многоадресными, то есть несколько объектов, которые связаны (зарегистрированы) с обработчиком событий, отвечают, когда событие возникает. Обработчики событий могут быть добавлены в цепочку с помощью оператора «+ =» и могут быть освобождены от цепей с помощью оператора «- =». ​​В качестве обработчика событий можно использовать как статический, так и метод экземпляра. Метод доступа к событиям может дать вам контроль над реализацией списка обработчиков событий.

Интерфейс может содержать события. События также могут быть абстрактными, тогда как основанное на методе доступа событие не может быть абстрактным. Событие может быть виртуальным и быть переопределено производным классом.

Ключевые различия между делегатами и событиями в C #

  1. Делегат - это объект, используемый в качестве указателя на функцию для хранения ссылки на метод. С другой стороны, события предоставляют абстракцию делегатам.
  2. Ключевое слово, необходимое для объявления делегата, является делегатом, тогда как ключевое слово, требуемое для объявления события, является событием .
  3. Делегат объявляется вне класса, тогда как событие объявляется внутри класса.
  4. Чтобы вызвать метод с использованием объекта делегата, метод должен быть связан с объектом делегата. С другой стороны, чтобы вызвать метод с использованием объекта события, метод должен быть связан с объектом события.
  5. Ковариация и Контравариантность обеспечивают дополнительную гибкость объектам делегата. С другой стороны, у события нет таких понятий.
  6. Event Accessor обрабатывает список обработчиков событий, тогда как делегат не имеет такого понятия.
  7. Делегаты независимы от событий, но события не могут быть созданы без делегата.

Заключение:

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

Top