Comportamiento de la palabra clave VB.NET WithEvents: ¿restricción del compilador VB.NET?
-
20-08-2019 - |
Pregunta
Estoy trabajando para familiarizarme tanto con C # como con VB.NET (el lenguaje utilizado en mi lugar de trabajo). Una de las mejores cosas sobre el proceso de aprendizaje es que al aprender sobre el otro idioma tiendes a aprender más sobre tu idioma principal; aparecen pequeñas preguntas como esta:
Según las fuentes que he encontrado y la experiencia pasada, un campo en VB.NET que se declara como WithEvents es capaz de generar eventos. Entiendo que C # no tiene un equivalente directo, pero mi pregunta es: los campos sin esta palabra clave en VB.NET no pueden generar eventos, ¿hay alguna manera de crear este mismo comportamiento en C #? ¿El compilador de VB simplemente bloquea estos objetos para que no manejen sus eventos (al tiempo que les permite generar eventos como de costumbre)?
Solo tengo curiosidad; No tengo ninguna aplicación en particular para la pregunta ...
Solución
Omitir WithEvents no impide que los miembros generen eventos. Simplemente le impide usar la palabra clave 'maneja' en sus eventos.
Aquí hay un uso típico de WithEvents:
Class C1
Public WithEvents ev As New EventThrower()
Public Sub catcher() Handles ev.event
Debug.print("Event")
End Sub
End Class
Aquí hay una clase que no usa WithEvents y es aproximadamente equivalente. Demuestra por qué WithEvents es tan útil:
Class C2
Private _ev As EventThrower
Public Property ev() As EventThrower
Get
Return _ev
End Get
Set(ByVal value As EventThrower)
If _ev IsNot Nothing Then
removehandler _ev.event, addressof catcher
End If
_ev = value
If _ev IsNot Nothing Then
addhandler _ev.event, addressof catcher
End If
End Set
End Property
Public Sub New()
ev = New EventThrower()
End Sub
Public Sub catcher()
Debug.print("Event")
End Sub
End Class