.net - example - raiseevent vb6
Cómo buscar suscriptores antes de presentar un evento en VB.NET (2)
A diferencia de su equivalente en C #, RaiseEvent
en VB.NET no generará una excepción si no hay oyentes, por lo que no es estrictamente necesario realizar la verificación nula primero.
Pero si quieres hacerlo de todos modos, hay una sintaxis para eso. Solo necesita agregar Event
como sufijo al final del nombre del evento. (Si no lo hace, obtendrá un error de compilación). Por ejemplo:
If ChangedEvent IsNot Nothing Then
RaiseEvent Changed(Me, EventArgs.Empty)
End If
Sin embargo, como dije antes, no estoy seguro de si hay algún beneficio real al hacer esto. Hace que su código no sea idiomático y más difícil de leer. El truco que presento aquí no está particularmente bien documentado, presumiblemente porque el objetivo de la palabra clave RaiseEvent
es manejar todo esto en segundo plano. Es mucho más conveniente e intuitivo de esa manera, dos objetivos de diseño del lenguaje VB.NET.
Otra razón por la que probablemente debas dejar esto para que se maneje automáticamente es porque es algo difícil hacerlo bien cuando lo haces de la manera C #. El fragmento de ejemplo que has mostrado en realidad contiene una condición de carrera, un error que está por ocurrir. Más específicamente, no es seguro para subprocesos. Se supone que debes crear una variable temporal que capture el conjunto actual de controladores de eventos, luego haz la comprobación nula. Algo como esto:
EventHandler tmp = Changed;
if (tmp != null)
{
tmp(this, EventArgs.Empty);
}
Eric Lippert tiene un gran artículo de blog sobre esto aquí , inspirado en esta pregunta sobre el desbordamiento de pila .
Curiosamente, si examina el código VB.NET desensamblado que utiliza la palabra clave RaiseEvent
, encontrará que está haciendo exactamente lo que hace el código C # correcto anterior: declara una variable temporal, realiza una comprobación nula y luego invoca al delegado. ¿Por qué desordenar su código con todo esto cada vez?
En C #, haces algo como esto:
if (Changed != null)
Changed(this, EventArgs.Empty);
¿Pero qué haces en VB.NET?
Hay RaiseEvent
, pero es
RaiseEvent Changed(Me, EventArgs.Empty)
realmente verificando que algo se haya suscrito al evento?
Una conversión directa sería:
If Changed IsNot Nothing Then
Changed(Me, EventArgs.Empty)
End If
Sin embargo, RaiseEvent
tiene que ser utilizado para generar eventos en VB.NET, no puede simplemente llamar al evento. No se lanza ninguna excepción con RaiseEvent
si no hay oyentes.
Ver: http://msdn.microsoft.com/en-GB/library/fwd3bwed(v=vs.71).aspx
Por lo tanto, se debe usar lo siguiente:
RaiseEvent Changed(Me, EventArgs.Empty)