В Visual Basic .NET делегаты (Delegate) — объекты, которые инкапсулируют ссылку на метод, а события (Events) — механизм уведомления подписчиков о наступлении определённых условий или изменений. Делегаты позволяют "передавать" поведение (методы) как параметры, а события реализуют шаблон издатель-подписчик.
Особенности:
Event внутри класса.AddHandler и отписка — через RemoveHandler.Пример:
' Определение делегата Public Delegate Sub NotifyHandler(ByVal message As String) ' Класс с событием Public Class Notifier Public Event OnNotify As NotifyHandler Public Sub DoWork() RaiseEvent OnNotify("Работа завершена!") End Sub End Class ' Подписка и вызов Dim n As New Notifier() AddHandler n.OnNotify, AddressOf SubNotify Sub SubNotify(ByVal msg As String) Console.WriteLine(msg) End Sub n.DoWork()
События особенно полезны в UI-программировании и диспетчеризации бизнес-логики.
Что произойдет, если вызвать событие RaiseEvent, и на него нет подписчиков?
Неправильный ответ: Будет ошибка времени выполнения.
Правильный ответ: Ничего не произойдёт — если на событие нет подписчиков, вызов RaiseEvent безопасен, исключения не будет.
Пример:
Public Event OnUpdate() ' Вызов RaiseEvent, даже если никто не подписан: RaiseEvent OnUpdate() ' Допустимо и не приводит к ошибке
История
В крупном desktop-приложении разработчик не отписал обработчики от событий, из-за чего объекты не освобождались сборщиком мусора (memory leak). Это приводило к росту памяти и сбоям через несколько часов работы.
История
Молодой специалист, не понимая работы делегатов и событий, случайно подписал один метод несколько раз подряд. Это приводило к множественному вызову одних и тех же обработчиков — пользователи получали дублирующиеся уведомления.
История
В одном проекте вызвали событиеRaiseEvent, предполагая, что оно обязательно сработает. На тестах обнаружили, что без подписчиков никакого эффекта нет, что привело к недоразумению в бизнес-логике приложения и ошибкам отчётности.