In Visual Basic ermöglichen Ereignisse (Events) einem Objekt, andere Komponenten der Anwendung über aufgetretene Änderungen zu benachrichtigen. Ein Ereignis wird mit dem Schlüsselwort Event deklariert. Es wird mit der Methode RaiseEvent (VB.NET) oder Raise (VB6) ausgelöst, und Komponenten können sich darauf anmelden (Handles/WithEvents).
Beispiel VB.NET:
Public Class Worker Public Event WorkCompleted As EventHandler Public Sub DoWork() ' ...eine Art Arbeit RaiseEvent WorkCompleted(Me, EventArgs.Empty) End Sub End Class Public Class Manager Private WithEvents w As Worker Public Sub New() w = New Worker() End Sub Private Sub w_WorkCompleted(sender As Object, e As EventArgs) Handles w.WorkCompleted Console.WriteLine("Arbeit abgeschlossen!") End Sub End Class
Wichtige Punkte:
WithEvents kann nur mit Feldern und Eigenschaften der Klasse verwendet werdenKann man ein Ereignis mit dem Zugriffsmodifizierer
Privatedeklarieren und sich aus einer anderen Klasse darauf anmelden?
Antwort: Nein, der Modifizierer Private beschränkt den Sichtbarkeitsbereich des Ereignisses nur auf die Klasse, in der es deklariert wurde. Andere Klassen können es nicht sehen und sich daher nicht anmelden.
Geschichte
In einer großen Anwendung wurden Ereignisse mit dem Modifizierer
Publicerstellt, aber nirgendwo ausdrücklich davon abgemeldet. Bei längerem Betrieb der Anwendung führte dies zu Speicherlecks, da die Handler auf nicht benötigte Objekte verwiesen.
Geschichte
Bei der Migration von VB6 zu VB.NET erwartete der Entwickler, dass das Ereignis in allen Modulen verfügbar ist, aber standardmäßig war das Ereignis
Friend. Infolgedessen wurde der Handler nicht ausgelöst, und dieser Fehler wurde erst bei den Integrationstests entdeckt.
Geschichte
Ein Programmierer machte einen Fehler in der Signatur des Delegaten des Ereignisses - er vertauschte
senderunde. Es gab keine Fehlermeldung (der Event-Handler wurde einfach nicht aufgerufen), und die benötigte Geschäftslogik wurde bis zur endgültigen Abnahme verborgen übergangen.