Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

24.3. Events versus Delegates

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

Bij een optreden van een event van een eventsource worden de - aan deze event gekoppelde - eventhandlers uitgevoerd.  Dit kan doordat de eventsource objecten delegates bijhouden van de methods (eventhandlers) die worden uitgevoerd bij het optreden van een event.
Bij het "raisen" van de event, zullen de delegates naar de eventhandlers worden geïnvokeerd.

De conclusie is dat events delegates zijn.  Events zijn slechts een taalconstructie die achter de schermen worden omgezet naar delegates.

Onderstaand voorbeeld illustreert hoe deze omzetting kan gebeuren.
Visual Basic 2012 Broncode - Codevoorbeeld 639
Namespace UsingEvents
    Class SomeEventSource
        Public Event SomeEvent()
        Public Sub RaiseSomeEvent()
            RaiseEvent SomeEvent()
        End Sub
    End Class
End Namespace
Omgezet naar :
Visual Basic 2012 Broncode - Codevoorbeeld 640
Namespace UsingDelegates
    Class SomeEventSource
        Public Delegate Sub SomeEventHandler()
        Private _SomeEvent As SomeEventHandler
        Public Sub add_SomeEvent(ByVal obj As SomeEventHandler)
            _SomeEvent = _
                        DirectCast(System.Delegate.Combine(_SomeEvent, obj),  _
                                   SomeEventHandler)
        End Sub
        Public Sub remove_SomeEvent(ByVal obj As SomeEventHandler)
            _SomeEvent = _
                        DirectCast(System.Delegate.Remove(_SomeEvent, obj),  _
                                   SomeEventHandler)
        End Sub
        Public Sub RaiseSomeEvent()
            If _SomeEvent IsNot Nothing Then _SomeEvent.Invoke()
        End Sub
    End Class
End Namespace
En de client :
Visual Basic 2012 Broncode - Codevoorbeeld 641
Namespace UsingEvents
    Class Client
        Private Shared WithEvents _SomeFirstEventSource As SomeEventSource
        Public Shared Sub Main()
            _SomeFirstEventSource = New SomeEventSource
            _SomeFirstEventSource.RaiseSomeEvent() ' "someEventHandler"
            '
            Dim someSecondEventSource As SomeEventSource = New SomeEventSource
            someSecondEventSource.RaiseSomeEvent() ' /
            AddHandler someSecondEventSource.SomeEvent, _
                       AddressOf someEventHandler
            someSecondEventSource.RaiseSomeEvent() ' "someEventHandler"
            AddHandler someSecondEventSource.SomeEvent, _
                       AddressOf someEventHandler
            someSecondEventSource.RaiseSomeEvent() ' "someEventHandler"
            '                                        "someEventHandler"
            RemoveHandler someSecondEventSource.SomeEvent, _
                          AddressOf someEventHandler
            someSecondEventSource.RaiseSomeEvent() ' "someEventHandler"
            RemoveHandler someSecondEventSource.SomeEvent, _
                          AddressOf someEventHandler
            someSecondEventSource.RaiseSomeEvent() ' /
            '
            Console.ReadLine()
        End Sub
        Private Shared Sub someEventHandler() _
                                        Handles _SomeFirstEventSource.SomeEvent
            Console.WriteLine("someEventHandler")
        End Sub
    End Class
End Namespace
Console Application Output
someEventHandler
someEventHandler
someEventHandler
someEventHandler
someEventHandler
Omgezet naar :
Visual Basic 2012 Broncode - Codevoorbeeld 642
Namespace UsingDelegates
    Class Client
        Private Shared _SomeFirstEventSource As SomeEventSource
        Public Shared Property SomeFirstEventSource() As SomeEventSource
            Get
                SomeFirstEventSource = _SomeFirstEventSource
            End Get
            Set(ByVal value As SomeEventSource)
                If _SomeFirstEventSource IsNot Nothing Then
                    _SomeFirstEventSource.remove_SomeEvent(AddressOf _
                                                               someEventHandler)
                End If
                _SomeFirstEventSource = value
                If _SomeFirstEventSource IsNot Nothing Then
                    _SomeFirstEventSource.add_SomeEvent(AddressOf _
                                                               someEventHandler)
                End If
            End Set
        End Property
        Public Shared Sub Main()
            SomeFirstEventSource = New SomeEventSource
            SomeFirstEventSource.RaiseSomeEvent() ' "someEventHandler"
            '
            Dim someSecondEventSource As SomeEventSource = New SomeEventSource
            someSecondEventSource.RaiseSomeEvent() ' /
            someSecondEventSource.add_SomeEvent(AddressOf someEventHandler)
            someSecondEventSource.RaiseSomeEvent() ' "someEventHandler"
            someSecondEventSource.add_SomeEvent(AddressOf someEventHandler)
            someSecondEventSource.RaiseSomeEvent() ' "someEventHandler"
            '                                        "someEventHandler"
            someSecondEventSource.remove_SomeEvent(AddressOf someEventHandler)
            someSecondEventSource.RaiseSomeEvent() ' "someEventHandler"
            someSecondEventSource.remove_SomeEvent(AddressOf someEventHandler)
            someSecondEventSource.RaiseSomeEvent() ' /
            '
            Console.ReadLine()
        End Sub
        Private Shared Sub someEventHandler()
            Console.WriteLine("someEventHandler")
        End Sub
    End Class
End Namespace
Console Application Output
someEventHandler
someEventHandler
someEventHandler
someEventHandler
someEventHandler
Deze omzetting (die op de achtergrond gebeurt bij het gebruik van de verkorte versie) verklaart veel, zo wordt verklaard dat :

- Enkel het object waarnaartoe het WithEvents gedeclareerde veld verwijst een eventsource object is.  In de setter van de SomeFirstEventSource property wordt immers eerst de eventhandler losgekoppeld van het oude eventsource object.
- Het gebruik van de RemoveHandler slechts de laatste koppeling met een eventhandler verwijdert, en niet allemaal.  De System.Delegate.Remove zal immers slecht de laatste delegate (van tweede argument) niet opnemen in de terugkeer waarde.
- ...

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.