Delegaten (Visual Basic)Delegates (Visual Basic)

Delegaten sind Objekte, die auf Methoden verweisen.Delegates are objects that refer to methods. Sie werden zuweilen als typsichere Funktionszeiger beschrieben, da sie in anderen Programmiersprachen verwendeten Funktionszeigern ähneln.They are sometimes described as type-safe function pointers because they are similar to function pointers used in other programming languages. Im Gegensatz zu Funktionszeigern sind Delegaten für Visual Basic ein Verweistyp basierend auf der Klasse sind jedoch System.Delegate.But unlike function pointers, Visual Basic delegates are a reference type based on the class System.Delegate. Delegaten können sowohl auf freigegebene Methoden – Methoden, die ohne eine bestimmte Instanz einer Klasse aufgerufen werden können – als auch Instanzmethoden verweisen.Delegates can reference both shared methods — methods that can be called without a specific instance of a class — and instance methods.

Delegaten und EreignisseDelegates and Events

Delegaten sind in Situationen hilfreich, in denen Sie einen Mittler zwischen einer aufrufenden Prozedur und der aufgerufenen Prozedur benötigen.Delegates are useful in situations where you need an intermediary between a calling procedure and the procedure being called. Ein Beispiel: Sie möchten, dass ein Objekt, das Ereignisse auslöst, unter verschiedenen Bedingungen verschiedene Ereignishandler aufrufen kann.For example, you might want an object that raises events to be able to call different event handlers under different circumstances. Leider ist dem Objekt, das die Ereignisse auslöst, nicht im Voraus bekannt, welcher Ereignishandler ein bestimmtes Ereignis verarbeitet.Unfortunately, the object raising the events cannot know ahead of time which event handler is handling a specific event. Visual Basic können Sie dynamische Zuordnung von Ereignishandlern mit Ereignissen durch einen Delegaten für die Sie erstellen, bei der Verwendung der AddHandler Anweisung.Visual Basic lets you dynamically associate event handlers with events by creating a delegate for you when you use the AddHandler statement. Zur Laufzeit leitet der Delegat dann Aufrufe an den entsprechenden Ereignishandler weiter.At run time, the delegate forwards calls to the appropriate event handler.

Obwohl Sie Ihre eigenen Delegaten, in den meisten Fällen erstellen können, die Visual Basic wird der Delegat erstellt und die Details für Sie übernimmt.Although you can create your own delegates, in most cases Visual Basic creates the delegate and takes care of the details for you. 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.For example, an Event statement implicitly defines a delegate class named <EventName>EventHandler as a nested class of the class containing the Event statement, and with the same signature as the event. Die AddressOf-Anweisung erstellt implizit eine Instanz eines Delegaten, die auf eine bestimmte Prozedur verweist.The AddressOf statement implicitly creates an instance of a delegate that refers to a specific procedure. Die folgenden beiden Codezeilen sind gleichwertig.The following two lines of code are equivalent. In der ersten Zeile sehen Sie die explizite Erstellung einer Instanz von EventHandler mit einem Verweis auf die Button1_Click-Methode, die als Argument gesendet wird.In the first line, you see the explicit creation of an instance of EventHandler, with a reference to method Button1_Click sent as the argument. Die zweite Zeile ist eine praktischere Möglichkeit, das Gleiche auszuführen.The second line is a more convenient way to do the same thing.

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 bestimmen kann.You can use the shorthand way of creating delegates anywhere the compiler can determine the delegate's type by the context.

Deklarieren von Ereignissen, die einen vorhandenen Delegattyp verwendenDeclaring Events that Use an Existing Delegate Type

In manchen Situationen empfiehlt es sich, ein Ereignis so zu deklarieren, dass es einen vorhandenen Delegattyp als zugrunde liegenden Delegaten verwendet.In some situations, you may want to declare an event to use an existing delegate type as its underlying delegate. Die folgende Syntax veranschaulicht dies:The following syntax demonstrates how:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

Dies ist nützlich, wenn mehrere Ereignisse an den gleichen Handler weitergeleitet werden sollen.This is useful when you want to route multiple events to the same handler.

Delegatvariablen und -parameterDelegate Variables and Parameters

Sie können Delegaten für andere, nicht auf Ereignisse bezogene Tasks (z.B. freies Threading) oder für Prozeduren verwenden, die zur Laufzeit verschiedene Versionen von Funktionen aufrufen müssen.You can use delegates for other, non-event related tasks, such as free threading or with procedures that need to call different versions of functions at run time.

Ein Beispiel: Eine Anwendung für Gebrauchtwagen-Kleinanzeigen enthält ein Listenfeld mit den Namen von Fahrzeugen.For example, suppose you have a classified-ad application that includes a list box with the names of cars. Die Anzeigen sind nach Titel sortiert, wobei es sich in der Regel um die Marke handelt.The ads are sorted by title, which is normally the make of the car. Ein Problem kann dann auftreten, wenn bei einigen Autos das Baujahr vor der Marke steht.A problem you may face occurs when some cars include the year of the car before the make. Das Problem besteht darin, dass die integrierte Suchfunktion des Listenfelds nur nach Zeichencodes sortiert. Daher werden alle Anzeigen, die mit dem Jahr beginnen, an den Beginn der Liste sortiert, erst dann folgen die Anzeigen, die mit der Marke beginnen.The problem is that the built-in sort functionality of the list box sorts only by character codes; it places all the ads starting with dates first, followed by the ads starting with the make.

Um dies zu beheben, können Sie eine Sortierprozedur in einer Klasse erstellen, die in den meisten Listenfeldern die standardmäßige alphabetische Sortierung verwendet, jedoch zur Laufzeit auf die benutzerdefinierte Sortierung für Gebrauchtwagenanzeigen umgestellt werden kann.To fix this, you can create a sort procedure in a class that uses the standard alphabetic sort on most list boxes, but is able to switch at run time to the custom sort procedure for car ads. Dafür übergeben Sie die benutzerdefinierte Sortierprozedur mithilfe von Delegaten zur Laufzeit an die Sortierklasse.To do this, you pass the custom sort procedure to the sort class at run time, using delegates.

AddressOf- und Lambda-AusdrückeAddressOf and Lambda Expressions

Jede Delegatklasse definiert einen Konstruktor, dem die Spezifikation einer Objektmethode übergeben wird.Each delegate class defines a constructor that is passed the specification of an object method. Ein Argument für einen Delegatkonstruktor muss ein Verweis auf eine Methode oder ein Lambda-Ausdruck sein.An argument to a delegate constructor must be a reference to a method, or a lambda expression.

Verwenden Sie die folgende Syntax, um einen Verweis auf eine Methode festzulegen:To specify a reference to a method, use the following syntax:

AddressOf [expression.]methodNameAddressOf [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.The compile-time type of the expression must be the name of a class or an interface that contains a method of the specified name whose signature matches the signature of the delegate class. Bei methodName kann es sich um eine freigegebene Methode oder um eine Instanzmethode handeln.The methodName can be either a shared method or an instance method. Der methodName ist nicht optional, selbst dann nicht, wenn Sie einen Delegaten für die Standardmethode der Klasse erstellen.The methodName is not optional, even if you create a delegate for the default method of the class.

Verwenden Sie die folgende Syntax, um einen Lambda-Ausdruck festzulegen:To specify a lambda expression, use the following syntax:

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

Das folgende Beispiel zeigt sowohl AddressOf- als auch Lambda-Ausdrücke, mit denen der Verweis für einen Delegaten angegeben wird.The following example shows both AddressOf and lambda expressions used to specify the reference for a delegate.

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 der des Delegattyps übereinstimmen.The signature of the function must match that of the delegate type. Weitere Informationen zu Lambdaausdrücken finden Sie unter Lambda Expressions (Lambdaausdrücke).For more information about lambda expressions, see Lambda Expressions. Beispiele für Lambda-Ausdrücke und AddressOf-Zuweisungen zu Delegaten finden Sie unter Gelockerte Delegatenkonvertierung.For more examples of lambda expression and AddressOf assignments to delegates, see Relaxed Delegate Conversion.

TitelTitle BeschreibungDescription
Vorgehensweise: Aufrufen einer DelegatenmethodeHow to: Invoke a Delegate Method Zeigt anhand eines Beispiels, wie Sie eine Methode einem Delegaten zuweisen und diese Methode anschließend über den Delegaten aufrufen.Provides an example that shows how to associate a method with a delegate and then invoke that method through the delegate.
Vorgehensweise: Übergeben von Prozeduren an eine andere Prozedur in Visual BasicHow to: Pass Procedures to Another Procedure in Visual Basic Veranschaulicht, wie Delegaten verwendet werden, um eine Prozedur an eine andere Prozedur zu übergeben.Demonstrates how to use delegates to pass one procedure to another procedure.
Gelockerte DelegatenkonvertierungRelaxed Delegate Conversion Beschreibt, wie Subs und Funktionen Delegaten oder Handlern zugewiesen werden können, auch wenn deren Signaturen nicht identisch sind.Describes how you can assign subs and functions to delegates or handlers even when their signatures are not identical
EreignisseEvents Stellt eine Übersicht über Ereignisse in Visual Basic bereit.Provides an overview of events in Visual Basic.