Délégués (Visual Basic)

Les délégués sont des objets qui font référence à des méthodes. Ils sont parfois décrits comme des pointeurs de fonction de type sécurisé, car ils sont comparables aux pointeurs de fonction utilisés dans d’autres langages de programmation. Mais, contrairement aux pointeurs de fonction, les délégués Visual Basic sont un type de référence basé sur la classe System.Delegate. Les délégués peuvent faire référence à des méthodes partagées (méthodes qui peuvent être appelées sans une instance spécifique de classe) et des méthodes d’instance.

Délégués et événements

Les délégués sont utiles dans les situations où un intermédiaire est nécessaire entre une procédure appelante et la procédure appelée. Par exemple, vous pouvez créer un objet qui déclenche des événements pour pouvoir appeler différents gestionnaires d’événements dans différentes circonstances. Malheureusement, l’objet qui déclenche les événements ne peut pas savoir à l’avance quel gestionnaire d’événements gère un événement donné. Visual Basic vous permet d’associer de façon dynamique des gestionnaires d’événements à des événements en créant un délégué lorsque vous utilisez l’instruction AddHandler. À l’exécution, le délégué transmet les appels au gestionnaire d’événements approprié.

Bien que vous puissiez créer vos propres délégués, dans la plupart des cas, Visual Basic crée le délégué et s’occupe des détails pour vous. Par exemple, une instruction Event définit implicitement une classe déléguée nommée <EventName>EventHandler comme classe imbriquée de la classe contenant l’instruction Event, avec la même signature que l’événement. L’instruction AddressOf crée implicitement une instance d’un délégué qui fait référence à une procédure spécifique. Les deux lignes de code suivantes sont équivalentes. Dans la première ligne, vous voyez la création explicite d’une instance de EventHandler, avec une référence à la méthode Button1_Click envoyée comme argument. La deuxième ligne est un moyen plus commode de faire la même chose.

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

Vous pouvez utiliser la syntaxe raccourcie pour créer des délégués dès l’instant où le compilateur peut déterminer le type du délégué par le contexte.

Déclaration d’événements utilisant un type délégué existant

Dans certaines situations, vous souhaiterez peut-être déclarer un événement pour utiliser un type délégué existant comme son délégué sous-jacent. La syntaxe suivante montre comment :

Delegate Sub DelegateType()
Event AnEvent As DelegateType

C’est utile pour acheminer plusieurs événements vers le même gestionnaire.

Paramètres et variables délégués

Vous pouvez utiliser des délégués pour d’autres tâches non liées aux événements, telles que le threading libre, ou avec des procédures qui doivent appeler différentes versions de fonctions à l’exécution.

Par exemple, supposons que vous disposez d’une application de petites annonces qui comprend une zone de liste avec les noms de voitures. Les annonces sont triées par titre, qui correspond normalement à la marque de la voiture. Vous pouvez rencontrer le cas de figure où certaines voitures indiquent l’année de la voiture avant la marque. Le problème est que la fonctionnalité de tri prédéfinie de la zone de liste trie seulement par code de caractères ; elle place en premier toutes les annonces qui commencent par une date, suivies des annonces qui commencent par la marque.

Pour résoudre ce problème, vous pouvez créer une procédure de tri dans une classe qui utilise le tri alphabétique standard sur la plupart des zones de liste, mais qui est capable, à l’exécution, de passer à la procédure de tri personnalisé pour les annonces de voiture. Pour ce faire, transmettez la procédure de tri personnalisée à la classe de tri à l’exécution, à l’aide de délégués.

Expressions lambda et AddressOf

Chaque classe déléguée définit un constructeur auquel les caractéristiques d’une méthode objet sont passées. L’argument d’un constructeur délégué doit être une référence à une méthode ou une expression lambda.

Pour spécifier une référence à une méthode, utilisez la syntaxe suivante :

AddressOf [expression.]methodName

Le type de compilation de expression doit être le nom d’une classe ou d’une interface qui contient une méthode portant le nom spécifié, dont la signature corresponde à celle de la classe déléguée. La méthode methodName peut être une méthode partagée ou d’instance. methodName n’est pas facultatif, même si l’on crée un délégué pour la méthode par défaut de la classe.

Pour spécifier une expression lambda, utilisez la syntaxe suivante :

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

L’exemple suivant illustre les expressions lambda et AddressOf utilisées pour spécifier la référence d’un délégué.

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

La signature de la fonction doit correspondre à celle du type délégué. Pour plus d’informations sur les expressions lambda, consultez Expressions Lambda. Pour voir plus d’exemples d’affectation d’expressions lambda et AddressOf aux délégués, consultez la page Conversion souple des délégués.

Titre Description
Comment : appeler une méthode déléguée Fournit un exemple d’association d’une méthode à un délégué, puis d’appel de cette méthode par le biais du délégué.
Comment : passer des procédures à une autre procédure en Visual Basic Montre comment utiliser des délégués pour transmettre une procédure à une autre procédure.
Conversion simplifiée des délégués Explique comment affecter des sous-routines et des fonctions aux délégués ou aux gestionnaires même si leurs signatures ne sont pas identiques.
Événements Fournit une vue d’ensemble des événements en Visual Basic.