ПРОГРАММИРОВАНИЕ02 сентября

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

Главное отличие event от delegate состоит в том, что event может быть запущен только в классе, в котором объявлен. Помимо этого, при наличии event компилятор создает не только соответствующее приватное поле-делегат, но еще и два открытых метода для подписки и ее отмены на события.

В следующей таблице перечислены различия между делегатом и событием в C#.

Делегат Событие
Делегат объявляется с помощью ключевого слова delegate.       Событие объявляется с помощью ключевого слова event.                                                    
Делегат — это указатель на функцию. Он содержит ссылку на один или несколько методов во время выполнения.                  Событие — это механизм уведомления, который зависит от делегатов.
Делегат независим и не зависит от событий. Событие зависит от делегата и не может быть создано без делегатов. Событие — это оболочка вокруг экземпляра делегата, которая не позволяет пользователям делегата сбрасывать делегат и его список вызовов и позволяет только добавлять или удалять цели из списка вызовов.                                                                                                             
Делегат включает методы Combine() и Remove() для добавления методов в список вызовов. Класс EventInfo проверяет события и подключает обработчики событий, которые включают методы AddEventHandler() и RemoveEventHandler() для добавления и удаления методов в список вызовов соответственно.                                                                                              
Делегат может быть передан как параметр метода.                         Событие возникает, но не может быть передано в качестве параметра метода.                     
Оператор = используется для назначения одного метода, а оператор += используется для назначения нескольких методов делегату.                                                                    Оператор = нельзя использовать с событиями, и только операторы += и -= можно использовать с событием, которое добавляет или удаляет обработчик события. Эти методы внутренне вызывают методы AddEventHandler и RemoveEventHandler.                                  

В некотором смысле событие является только делегатом. Программный код будет работать, даже если вы удалите ключевое слово event и будете использовать только делегат. Однако, используя ключевое слово event, мы запрещаем подписчикам регистрироваться на событие, используя оператор = и тем самым удаляя все обработчики.

Пример: событие против делегата

public delegate void Notify();
public Notify MyDelegate;

MyDelegate = MyMethod;// valid
MyDelegate += MyMethod;// valid

public delegate void Notify();
public event Notify MyEvent;

MyEvent = MyEventHandler;// Error
MyEvent += MyEventHandler;// valid

Ссылки на статьи
Делегаты
Разница между делегатами и событиями в C#
Делегат в Си Шарп
Диалог в WPF C#. Работа с файловой системой. Библиотека Оokii Dialogs WPF
Файловая система
Работа с файловой системой
Библиотека Оokii Dialogs WPF
MVVM 
MVVM - просто о сложном. Пример на C#
MVVM и внедрение зависимостей Часть 1
MVVM и внедрение зависимостей Часть 2

Теги: #c#, #delegate c#, #event c#

Комментарии

Добавить комментарий:

Отметьте что вы не робот

Вернуться наверх