Freigeben über


Delegaten (Visual Basic)

Delegaten sind Objekte, die auf Methoden verweisen. Sie werden mitunter als typsichere Funktionszeiger bezeichnet, da sie Funktionszeigern ähneln, die in anderen Programmiersprachen verwendet werden. Im Gegensatz zu Funktionszeigern sind Visual Basic-Delegaten ein Referenztyp, der auf der Delegate-Klasse basiert. Delegaten können sowohl auf freigegebene Methoden (d. h. Methoden, die ohne eine bestimmte Instanz einer Klasse aufgerufen werden können) als auch auf Instanzenmethoden verweisen.

Delegaten und Ereignisse

Delegaten sind in Situationen nützlich, in denen Sie einen Mittler zwischen einer aufrufenden Prozedur und der aufgerufenen Prozedur benötigen. Vielleicht soll z. B. ein Objekt, das Ereignisse auslöst, die Fähigkeit haben, in verschiedenen Situationen unterschiedliche Ereignishandler aufzurufen. Leider ist dem Objekt, von dem die Ereignisse ausgelöst werden, nicht vorzeitig bekannt, von welchem Ereignishandler ein bestimmtes Ereignis behandelt wird. Visual Basic ermöglicht die dynamische Zuordnung von Ereignishandlern zu Ereignissen durch Erstellen eines Delegaten, wenn die AddHandler-Anweisung verwendet wird. Zur Laufzeit leitet der Delegat dann Aufrufe an den entsprechenden Ereignishandler weiter.

Sie können zwar auch eigene Delegaten erstellen, doch in den meisten Fällen generiert Visual Basic den Delegaten und verarbeitet die Details. Eine Event-Anweisung definiert z. B. implizit eine Delegatklasse mit dem Namen <EventName>EventHandler als geschachtelte Klasse der Klasse, die die Event-Anweisung enthält, und mit der gleichen Signatur wie das Ereignis. Die AddressOf-Anweisung erstellt implizit eine Instanz eines Delegaten, die auf eine bestimmte Prozedur verweist. Die folgenden zwei Codezeilen sind gleichwertig. In der ersten Zeile wird die explizite Erstellung einer Instanz von Eventhandler mit einem Verweis auf die Button1_Click-Methode angezeigt, die als Argument gesendet wird. Die zweite Zeile ist eine zweckmäßigere Möglichkeit, den gleichen Schritt auszuführen.

AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
' The following line of code is shorthand for the previous line. 
AddHandler Button1.Click, AddressOf Me.Button1_Click

Die schnelle Methode zum Erstellen von Delegaten können Sie immer dort verwenden, wo der Compiler den Delegattyp anhand des Kontexts erkennen kann.

Deklarieren von Ereignissen, die einen vorhandenen Delegattyp verwenden

In manchen Situationen empfiehlt es sich, ein Ereignis so zu deklarieren, dass es einen vorhandenen Delegattyp als zugrunde liegenden Delegaten verwendet. Die folgende Syntax veranschaulicht dies:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

Dies ist nützlich, wenn mehrere Ereignisse an den gleichen Handler weitergeleitet werden sollen.

Delegatvariablen und -parameter

Sie können Delegaten für andere, nicht mit Ereignissen verknüpfte Aufgaben (z. B. freies Threading) oder für Prozeduren verwenden, die zur Laufzeit verschiedene Versionen von Funktionen aufrufen müssen.

Beispiel: Eine Anwendung für Gebrauchtwagen-Kleinanzeigen enthält ein Listenfeld mit den Namen von Fahrzeugen. Die Anzeigen sind nach Titel sortiert. Der Titel ist in der Regel der Name des Fahrzeugherstellers. Ein mögliches Problem tritt auf, wenn bei einigen Autos das Herstellungsjahr des Autos vor dem Herstellernamen steht. Das Problem besteht darin, dass die integrierte Suchfunktion des Listenfelds nur nach Zeichencodes sortiert. Dadurch werden alle Anzeigen, die mit dem Jahr beginnen, an den Beginn der Liste platziert, erst dann folgen die Anzeigen, die mit dem Herstellernamen beginnen.

Um dies zu beheben, können Sie eine Sortierprozedur in einer Klasse erstellen, die auf der standardmäßigen alphabetischen Sortierung basiert, die für die meisten Listenfelder gilt, jedoch zur Laufzeit auf die benutzerdefinierte Sortierung für Gebrauchtwagen umgestellt werden kann. Dafür übergeben Sie die benutzerdefinierte Sortierprozedur mithilfe von Delegaten zur Laufzeit an die Sortierklasse.

AddressOf- und Lambda-Ausdrücke

Jede Delegatklasse definiert einen Konstruktor, an den die Spezifikation einer Objektmethode übergeben wird. Ein Argument für einen Delegatkonstruktor muss ein Verweis auf eine Methode oder ein Lambda-Ausdruck sein.

Verwenden Sie die folgende Syntax, um einen Verweis auf eine Methode festzulegen:

AddressOf [expression.]methodName

Der Typ von expression muss zur Kompilierungszeit der Name einer Klasse oder Schnittstelle sein, die eine Methode des angegebenen Namens enthält, deren Signatur mit der Signatur der Delegatklasse übereinstimmt. Mit methodName kann entweder eine freigegebene Methode oder eine Instanzenmethode angegeben werden. methodName ist nicht optional, selbst dann nicht, wenn Sie einen Delegaten für die Standardmethode der Klasse erstellen.

Verwenden Sie die folgende Syntax, um einen Lambda-Ausdruck festzulegen:

Function ([parm As type, parm2 As type2, ...]) expression

Im folgenden Beispiel werden sowohl AddressOf- als auch Lambda-Ausdrücke angezeigt, mit denen der Verweis für einen Delegaten angegeben wird.

Module Module1

    Sub Main()
        ' Create an instance of InOrderClass and assign values to the properties. 
        ' InOrderClass method ShowInOrder displays the numbers in ascending  
        ' or descending order, depending on the comparison method you specify. 
        Dim inOrder As New InOrderClass
        inOrder.Num1 = 5
        inOrder.Num2 = 4

        ' Use AddressOf to send a reference to the comparison function you want 
        ' to use.
        inOrder.ShowInOrder(AddressOf GreaterThan)
        inOrder.ShowInOrder(AddressOf LessThan)

        ' Use lambda expressions to do the same thing.
        inOrder.ShowInOrder(Function(m, n) m > n)
        inOrder.ShowInOrder(Function(m, n) m < n)
    End Sub 

    Function GreaterThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean 
        Return num1 > num2
    End Function 

    Function LessThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean 
        Return num1 < num2
    End Function 

    Class InOrderClass
        ' Define the delegate function for the comparisons. 
        Delegate Function CompareNumbers(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean 
        ' Display properties in ascending or descending order. 
        Sub ShowInOrder(ByVal compare As CompareNumbers)
            If compare(_num1, _num2) Then
                Console.WriteLine(_num1 & "  " & _num2)
            Else
                Console.WriteLine(_num2 & "  " & _num1)
            End If 
        End Sub 

        Private _num1 As Integer 
        Property Num1() As Integer 
            Get 
                Return _num1
            End Get 
            Set(ByVal value As Integer)
                _num1 = value
            End Set 
        End Property 

        Private _num2 As Integer 
        Property Num2() As Integer 
            Get 
                Return _num2
            End Get 
            Set(ByVal value As Integer)
                _num2 = value
            End Set 
        End Property 
    End Class 
End Module

Die Signatur der Funktion muss mit dem Delegattyp übereinstimmen. Weitere Informationen zu Lambdaausdrücken finden Sie unter Lambda-Ausdrücke (Visual Basic). Weitere Beispiele für Lambda-Ausdrücke und AddressOf-Zuweisungen zu Delegaten finden Sie unter Gelockerte Delegatenkonvertierung (Visual Basic).

Verwandte Themen

Titel

Beschreibung

Gewusst wie: Aufrufen einer Delegatenmethode (Visual Basic)

Zeigt anhand eines Beispiels, wie Sie eine Methode einem Delegaten zuweisen und diese Methode anschließend über den Delegaten aufrufen.

Gewusst wie: Übergeben von Prozeduren an eine andere Prozedur in Visual Basic

Veranschaulicht, wie Delegaten verwendet werden, um eine Prozedur einer anderen Prozedur zu übergeben.

Gelockerte Delegatenkonvertierung (Visual Basic)

Beschreibt, wie Unterroutinen und Funktionen Delegaten oder Handlern zugewiesen werden können, auch wenn deren Signaturen nicht identisch sind.

Ereignisse (Visual Basic)

Stellt eine Übersicht über Ereignisse in Visual Basic bereit.