2009-05-08 10 views
15

Sto lavorando per diventare familiare con C# come lo sono con VB.NET (il linguaggio utilizzato sul mio posto di lavoro). Una delle cose migliori del processo di apprendimento è che imparando l'altra lingua si tende ad imparare di più sulla propria lingua primaria: piccole domande come questa:VB.NET Comportamento delle parole chiave WithEvents: restrizione del compilatore VB.NET?

Secondo le fonti che ho trovato e passato esperienza, un campo in VB.NET dichiarato come WithEvents è in grado di generare eventi. Capisco che C# non ha un equivalente diretto - ma la mia domanda è: campi senza questa parola chiave in VB.NET non può generare eventi, c'è un modo per creare questo stesso comportamento in C#? Il compilatore VB semplicemente blocca questi oggetti dall'avere gestito i loro eventi (mentre in realtà consente loro di aumentare gli eventi come al solito)?

Sono solo curioso; Non ho alcuna domanda particolare per la domanda ...

+1

+1 sto cercando l'inversione esatta, il che significa che sto imparando VBNET da C#. Grazie per la tua buona domanda –

+2

@Will: divertiti, VB.NET ottiene un brutto colpo per il 'VB' nel suo nome ma è in gran parte infondato-- VB.NET è un linguaggio completamente diverso da VB. Tieni a mente che dovresti sempre impostare "Option Strict On" e "Option Explicit On". Queste due linee regneranno in un paio delle opzioni del compilatore di default. Se la tua esperienza è come la mia, imparerai di più su entrambe le lingue. – STW

+0

yeah im same di Will ed è stato un aiuto per me capire cosa fa WithEvents :) grazie ancora! – Illuminati

risposta

20

Omettere WithEvents non impedisce ai membri di generare eventi. Ti impedisce semplicemente di utilizzare la parola chiave "maniglie" sui loro eventi.

Ecco un uso normale WithEvents:

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

Ecco una classe che non utilizza WithEvents ed è approssimativamente equivalente. Esso dimostra perché WithEvents è molto 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

Immagino di non averlo mai notato - probabilmente perché l'unica volta in cui presta attenzione è quando ottengo l'errore :-) – STW