ПРОГРАММИРОВАНИЕ02 сентября
Главное отличие event от delegate состоит в том, что event может быть запущен только в классе, в котором объявлен. Помимо этого, при наличии event компилятор создает не только соответствующее приватное поле-делегат, но еще и два открытых метода для подписки и ее отмены на события.
В следующей таблице перечислены различия между делегатом и событием в C#.
Делегат | Событие |
---|---|
Делегат объявляется с помощью ключевого слова delegate. | Событие объявляется с помощью ключевого слова event. |
Делегат — это указатель на функцию. Он содержит ссылку на один или несколько методов во время выполнения. | Событие — это механизм уведомления, который зависит от делегатов. |
Делегат независим и не зависит от событий. | Событие зависит от делегата и не может быть создано без делегатов. Событие — это оболочка вокруг экземпляра делегата, которая не позволяет пользователям делегата сбрасывать делегат и его список вызовов и позволяет только добавлять или удалять цели из списка вызовов. |
Делегат включает методы Combine() и Remove() для добавления методов в список вызовов. | Класс EventInfo проверяет события и подключает обработчики событий, которые включают методы AddEventHandler() и RemoveEventHandler() для добавления и удаления методов в список вызовов соответственно. |
Делегат может быть передан как параметр метода. | Событие возникает, но не может быть передано в качестве параметра метода. |
Оператор = используется для назначения одного метода, а оператор += используется для назначения нескольких методов делегату. | Оператор = нельзя использовать с событиями, и только операторы += и -= можно использовать с событием, которое добавляет или удаляет обработчик события. Эти методы внутренне вызывают методы AddEventHandler и RemoveEventHandler. |
В некотором смысле событие является только делегатом. Программный код будет работать, даже если вы удалите ключевое слово event и будете использовать только делегат. Однако, используя ключевое слово event, мы запрещаем подписчикам регистрироваться на событие, используя оператор = и тем самым удаляя все обработчики.
Пример: событие против делегата
public Notify MyDelegate;
MyDelegate = MyMethod;// valid
MyDelegate += MyMethod;// valid
public delegate void Notify();
public event Notify MyEvent;
MyEvent = MyEventHandler;// Error
MyEvent += MyEventHandler;// valid
Разница между делегатами и событиями в C#MVVM и внедрение зависимостей Часть 2
Теги: #c#, #delegate c#, #event c#
Ваш комментарий успешно добавлен.
После проверки комментарий будет опубликован на сайте.