2009-05-08 15 views
15

Estoy trabajando en 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, usted tiende a aprender más sobre su idioma principal: pequeñas preguntas como esta:Comportamiento de la palabra clave VB.NET WithEvents: ¿restricción del compilador VB.NET?

De acuerdo con las fuentes que he encontrado y el pasado experiencia, 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: campos sin esta palabra clave en VB.NET no puede 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 ...

+1

+1 Estoy intentando la inversión exacta, lo que significa que estoy aprendiendo VBNET desde C#. Gracias por su buena pregunta –

+2

@Will: diviértase, VB.NET tiene un mal rollo para el 'VB' en su nombre, pero es en gran parte infundado--VB.NET es un lenguaje completamente diferente de VB. Solo tenga en cuenta que siempre debe configurar 'Option Strict On' y' Option Explicit On'. Esas dos líneas reinarán en un par de las opciones predeterminadas del compilador. Si tu experiencia es como la mía, aprenderás más sobre ambos idiomas. – STW

+0

Sí, soy el mismo que Will y fue una ayuda para mí entender lo que hace WithEvents :) ¡gracias de nuevo! – Illuminati

Respuesta

20

Omitir WithEvents no bloquea a los miembros para que no generen eventos. Simplemente evita que uses la palabra clave 'controles' en sus eventos.

Aquí es 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í es una clase que no utiliza WithEvents y es aproximadamente equivalente. Demuestra por qué WithEvents es bastante ú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 
+0

Supongo que nunca lo había notado, probablemente porque la única vez que le presto atención es cuando me aparece el error :-) – STW

Cuestiones relacionadas