2009-05-08 8 views
15

Je travaille à devenir aussi familier avec C# que je le suis avec VB.NET (la langue utilisée sur mon lieu de travail). Une des meilleures choses à propos du processus d'apprentissage est qu'en apprenant l'autre langue, vous avez tendance à en apprendre davantage sur votre langue maternelle - de petites questions comme celle-ci apparaissent:Comportement du mot clé VB.NET WithEvents - Restriction du compilateur VB.NET?

D'après les sources que j'ai trouvées et passées expérience, un champ dans VB.NET déclaré WithEvents est capable de déclencher des événements. Je comprends que C# n'a pas un équivalent direct - mais ma question est: champs sans ce mot-clé dans VB.NET ne peut pas élever des événements, est-il un moyen de créer ce même comportement en C#? Est-ce que le compilateur VB bloque simplement ces objets de la gestion de leurs événements (tout en leur permettant de déclencher des événements comme d'habitude)?

Je suis juste curieux; Je n'ai aucune application particulière pour la question ...

+1

+1 J'essaie l'inversion exacte, ce qui signifie que j'apprends VBNET à partir de C#. Merci pour votre bonne question –

+2

@Will: Amusez-vous, VB.NET obtient une mauvaise réputation pour le 'VB' dans son nom, mais est largement infondée - VB.NET est une langue entièrement différente de VB. Gardez juste à l'esprit que vous devriez toujours régler "Option Strict On" et "Option Explicit On". Ces deux lignes vont régner dans quelques-unes des options du compilateur par défaut. Si votre expérience est comme la mienne, vous en apprendrez plus sur les deux langues. – STW

+0

ouais im même que Will et ce fut une aide pour moi de comprendre ce que fait WithEvents :) merci encore! – Illuminati

Répondre

20

Omettre WithEvents ne bloque pas les membres d'élever des événements. Cela vous empêche d'utiliser le mot clé 'handles' sur leurs événements.

Voici une utilisation typique de WithEvents:

Class C1 
    Public WithEvents ev As New EventThrower() 
    Public Sub catcher() Handles ev.event 
     Debug.print("Event") 
    End Sub 
End Class 

Voici une classe qui n'utilise pas WithEvents et est à peu près équivalent. Cela démontre pourquoi WithEvents est très utile:

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

Je suppose que je ne l'avais jamais remarqué - probablement parce que la seule fois où je fais attention à ça c'est quand j'ai l'erreur :-) – STW