Comportamiento de la palabra clave VB.NET WithEvents: ¿restricción del compilador VB.NET?

StackOverflow https://stackoverflow.com/questions/840691

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 ...

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top