ProgramaciónDesarrollador VB.NET

Descríbeme la mecánica de eventos (Events) en Visual Basic y proporciona un ejemplo de cómo crear un evento personalizado. ¿Qué aspectos deben tenerse en cuenta al declarar y suscribirse?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

En Visual Basic, los eventos (Events) permiten que un objeto notifique a otros componentes de la aplicación sobre cambios que han ocurrido. Un evento se declara mediante la palabra clave Event. Se invoca utilizando el método RaiseEvent (VB.NET) o Raise (VB6), y los componentes pueden suscribirse a él (Handles/WithEvents).

Ejemplo VB.NET:

Public Class Worker Public Event WorkCompleted As EventHandler Public Sub DoWork() ' ...hacer algún trabajo RaiseEvent WorkCompleted(Me, EventArgs.Empty) End Sub End Class Public Class Manager Private WithEvents w As Worker Public Sub New() w = New Worker() End Sub Private Sub w_WorkCompleted(sender As Object, e As EventArgs) Handles w.WorkCompleted Console.WriteLine("¡Trabajo completado!") End Sub End Class

Aspectos importantes:

  • Un evento solo puede ser invocado en la misma clase donde fue declarado.
  • Si el evento tiene argumentos, sus tipos deben ser estrictamente definidos.
  • WithEvents solo se puede usar con campos y propiedades de clase.
  • Al suscribirse a un evento, no olvide desuscribirse si es necesario (por ejemplo, para evitar fugas de memoria).

Pregunta trampa

¿Se puede declarar un evento con el modificador de acceso Private y suscribirse a él desde otra clase?

Respuesta: No, el modificador Private restringe la visibilidad del evento solo a la clase donde fue declarado. Otras clases no podrán verlo, por lo tanto, no podrán suscribirse.

Ejemplos de errores reales debido al desconocimiento de los matices del tema


Historia

En una gran aplicación, los eventos se creaban con el modificador Public, pero en ningún lugar se desuscribían explícitamente. Con el tiempo, esto llevaba a fugas de memoria, ya que los manejadores referenciaban objetos innecesarios.


Historia

Durante la migración de VB6 a VB.NET, el desarrollador esperaba que el evento estuviera disponible en todos los módulos, pero por defecto el evento era Friend. Como resultado, el manejador no se activaba, y este error solo se encontró en las pruebas de integración.


Historia

El programador cometió un error en la firma del delegado del evento: intercambió sender y e. No hubo ningún mensaje de error (el manejador de eventos simplemente no se llamaba), y la lógica de negocio necesaria se omitió silenciosamente hasta la versión casi final.