En Visual Basic .NET, los delegados (Delegate) son objetos que encapsulan una referencia a un método, y los eventos (Events) son un mecanismo para notificar a los suscriptores sobre la ocurrencia de ciertas condiciones o cambios. Los delegados permiten "pasar" comportamientos (métodos) como parámetros, y los eventos implementan el patrón publicador-suscriptor.
Características:
Event dentro de una clase.AddHandler y la desuscripción se hace mediante RemoveHandler.Ejemplo:
' Definición del delegado Public Delegate Sub NotifyHandler(ByVal message As String) ' Clase con evento Public Class Notifier Public Event OnNotify As NotifyHandler Public Sub DoWork() RaiseEvent OnNotify("¡Trabajo completado!") End Sub End Class ' Suscripción y llamada Dim n As New Notifier() AddHandler n.OnNotify, AddressOf SubNotify Sub SubNotify(ByVal msg As String) Console.WriteLine(msg) End Sub n.DoWork()
Los eventos son especialmente útiles en la programación de interfaces de usuario y en la gestión de la lógica de negocio.
¿Qué sucederá si se llama al evento RaiseEvent y no hay suscriptores?
Respuesta incorrecta: Ocurrirá un error en tiempo de ejecución.
Respuesta correcta: No sucederá nada; si no hay suscriptores para el evento, la llamada a RaiseEvent es segura y no generará excepciones.
Ejemplo:
Public Event OnUpdate() ' Llamar a RaiseEvent, incluso si nadie está suscrito: RaiseEvent OnUpdate() ' Es aceptable y no provoca error
Historia
En una gran aplicación de escritorio, un desarrollador no canceló la suscripción de los manejadores de eventos, lo que provocó que los objetos no fueran liberados por el recolector de basura (fugas de memoria). Esto llevó a un aumento en el uso de memoria y a fallas después de varias horas de funcionamiento.
Historia
Un joven profesional, sin comprender el funcionamiento de los delegados y eventos, suscribió accidentalmente un método varias veces seguidas. Esto causó que se llamaran multiplicadamente los mismos manejadores, resultando en notificaciones duplicadas para los usuarios.
Historia
En un proyecto, se llamó a un eventoRaiseEvent, suponiendo que siempre tendría efecto. En las pruebas se descubrió que sin suscriptores no había ningún efecto, lo que llevó a un malentendido en la lógica de negocio de la aplicación y a errores en los informes.