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

Вибір Редакції

Різниця між делегатами та подіями на C #

Користувачі і події грають важливу роль у програмі, що керується подіями. Делегати можуть звертатися до методу, і це дуже схоже на покажчик функцій у C ++. Події повідомляють, що деякі дії були виконані. Основна відмінність між делегатами та подіями полягає в тому, що делегати утримують посилання на методи і подія забезпечує спосіб доступу до цього методу за допомогою делегатів.

Діаграма порівняння

Основа для порівнянняДелегатиПодії
ОсновнийДелегат містить посилання на метод.Подія є надмірною абстракцією, що надається делегатам.
Синтаксисделегат return_type delegate_name (параметр_список);event_delegate event_name;
Ключове словоДелегат оголошується за допомогою ключового слова "делегат".Подія оголошується за допомогою ключового слова "подія".
ДеклараціяДелегат оголошується поза будь-яким класом.Подія оголошується всередині класу.
ВикликатиЩоб викликати метод, він повинен бути переданий делегату.Щоб викликати метод, він повинен бути присвоєний події.
Коваріації та контраваріаціїВони надають делегатам гнучкість.Такого поняття немає.
Доступ до подіїТакого поняття немає.Керує списком обробників подій.
ЗалежністьДелеги не залежать від подій.Подія не може бути створена без делегатів.

Визначення делегатів

У C # делегати використовуються як покажчик функції для посилання на метод. Це, зокрема, об'єкт, який посилається на метод, призначений йому. Цей же делегат може використовуватися для віднесення різних методів, оскільки він здатний утримувати посилання на різні методи, але один за одним. Який метод буде викликано делегатом, визначається під час виконання. Синтаксис декларування делегатів такий:

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

Тут return_type оголошує тип значення, що повертається методом, який викликається делегатів, а delegate_name - ім'ям делегатів. Параметр list_list визначає список параметрів, необхідних для методів, які буде викликано делегатом.

Є кілька важливих моментів, які слід пам'ятати про делегатів. Він може викликати будь-який метод, який відповідає його підпису і типу повернення. Делегат може викликати як метод примірника, так і статичний метод. Якщо він викликає метод екземпляра, він повинен скористатися допомогою об'єкта для виклику методу. Делегати підтримують багатоадресну передачу, тобто ви можете об'єднати способи, які будуть автоматично викликані, коли викликається делегат, що посилається на них. Вам просто потрібно створити об'єкт делегатів і призначити методи один за іншим ланцюжку за допомогою оператора "+ =". Ви також можете вилучити метод, використовуючи оператор "- =".

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

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

Визначення подій

Події - це виконувана дія, яка змінює стан об'єкта. Події оголошуються за допомогою делегатів, без присутності делегатів не можна оголошувати події. Можна сказати, що подія забезпечує інкапсуляцію делегатам. Існують два важливі складові при роботі з подіями, які є обробниками подій і подій. Якщо об'єкти зацікавлені в події, то він реєструє обробник події для цієї конкретної події. І всякий раз, коли відбуваються події, реєструються оброблені обробники подій. Оголошення про подію:

 event_delegate event_name; 

Тут, "event" - це ключове слово, яке показує оголошення події. Далі, event_delegate показуватиме ім'я делегата, який підтримує подію. Потім ім'я події - назва події

Є деякі важливі моменти, які необхідно пам'ятати під час роботи з подіями. Подібно до делегатів, події також можуть бути багатоадресною, тобто кілька об'єктів, які прив'язані (зареєстровані) до обробника подій, реагують на підняті події. Обробники подій можуть бути додані до ланцюга за допомогою оператора "+ =" і можуть бути розформовані за допомогою оператора "- =" Як статичний, так і екземплярний метод можна використовувати в якості обробника подій. Засіб доступу до подій може дати вам контроль над реалізацією списку обробників подій.

Інтерфейс може містити події. Події також можуть бути абстрактними, тоді як подія, заснована на доступі, не може бути абстрактною. Подія може бути віртуальною і перевизначена похідним класом.

Ключові відмінності між делегатами та подіями в C #

  1. Делегат - це об'єкт, який використовується як покажчик функції для утримання посилання на метод. З іншого боку, події забезпечують абстрагування для делегатів.
  2. Ключове слово, необхідне для оголошення делегатів, є делегатом, тоді як ключове слово, необхідне для оголошення події, є подією .
  3. Делегат оголошується поза класу, тоді як подія оголошується всередині класу.
  4. Щоб викликати метод, використовуючи об'єкт-делегат, метод повинен бути переданий об'єкту-делегат. З іншого боку, щоб викликати метод, використовуючи об'єкт події, метод повинен бути переданий об'єкту події.
  5. Коваріація та контраваріація забезпечують додаткову гнучкість для об'єктів-делегатів. З іншого боку, подія не має таких понять.
  6. Accessor обробляє список обробників подій, в той час як делегат не має такої концепції.
  7. Делегати незалежні від подій, але події не можуть бути створені без делегатів.

Висновок:

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

Top