Délégués (Visual Basic)

Les délégués sont des objets qui font référence aux méthodes. Ils sont parfois décrits comme des pointeurs fonction de type sécurisé car ils sont comparables aux pointeurs 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 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 d'une classe) et à des méthodes d'instance.

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

Les délégués sont utiles lorsque vous avez besoin d'un intermédiaire entre une procédure appelante et la procédure appelée. Vous pouvez, par exemple, souhaiter un objet qui déclenche des événements pour pouvoir appeler différents gestionnaires d'événements dans des circonstances différentes. Malheureusement, l'objet qui déclenche les événements ne peut pas savoir par avance quel gestionnaire d'événements gère un événement spécifique. Visual Basic vous laisse associer dynamiquement les gestionnaires d'événements aux événements en créant automatiquement un délégué lorsque vous utilisez l'instruction AddHandler. Au moment de 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, c'est Visual Basic qui se charge le plus souvent de créer le délégué et de gérer tous les détails à votre place. Par exemple, une instruction Event définit implicitement une classe déléguée appelée <EventName>EventHandler en tant que classe imbriquée de la classe contenant l'instruction Event, ce 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. Sur la première ligne, vous pouvez voir la création explicite d'une instance d'Eventhandler, avec une référence à la méthode Button1_Click envoyée comme argument. La deuxième ligne offre un moyen plus pratique d'effectuer la même opération.

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 méthode abrégée de création de délégués à chaque fois que le compilateur peut déterminer le type du délégué en fonction du contexte.

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

Dans certaines situations, vous pouvez choisir de déclarer un événement pour utiliser un type délégué existant comme son délégué sous-jacent. La syntaxe ci-dessous vous indique comment procéder :

Delegate Sub DelegateType()
Event AnEvent As DelegateType

Cela peut vous être utile lorsque vous voulez router plusieurs événements vers le même gestionnaire.

Variables et paramètres de délégués

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

Supposons, par exemple, que vous ayez une application de gestion de petites annonces contenant une zone de liste affichant les noms de voitures. Les annonces sont triées par titre, lequel correspond normalement à la marque de la voiture. Un problème peut néanmoins se poser lorsque, pour certaines voitures, la marque est précédée de l'année de mise en circulation. Ce cas représente un vrai problème, car la fonctionnalité de tri intégrée de la zone de liste base son tri sur les codes de caractères ; elle commence donc par trier en tête de liste toutes les annonces dont l'intitulé commence par des dates pour ensuite traiter les annonces dont l'intitulé commence 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 dans la plupart des zones de liste, mais qui est capable, au moment de l'exécution, de passer à la procédure de tri personnalisée définie pour les petites annonces concernant les voitures. Pour ce faire, vous faites appel à des délégués pour passer la procédure de tri personnalisée à la classe de tri au moment de l'exécution.

Expressions AddressOf et lambda

Chaque classe déléguée définit un constructeur auquel les caractéristiques d'une méthode objet sont passées. Un argument à un constructeur délégué doit correspondre à 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 l'expression au moment de la compilation doit correspondre au nom d'une classe ou d'une interface qui contient une méthode avec le nom spécifié dont la signature correspond à celle de la classe déléguée. La méthode methodName peut être soit une méthode partagée, soit une méthode d'instance. methodName n'est pas facultatif, même si vous créez 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 affiche à la fois des expressions lambda et des expressions AddressOf utilisées pour spécifier la référence pour 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 (Visual Basic). Pour obtenir plus d'exemples d'expressions lambda et d'assignations AddressOf aux délégués, consultez Conversion simplifiée des délégués (Visual Basic).

Rubriques connexes

Titre

Description

Comment : appeler une méthode déléguée (Visual Basic)

Fournit un exemple qui montre comment associer une méthode à un délégué, puis comment appeler cette méthode par le biais du délégué.

Comment : passer des procédures à une autre procédure en Visual Basic

Illustre comment utiliser des délégués pour passer d'une procédure à une autre.

Conversion simplifiée des délégués (Visual Basic)

Décrit la façon dont vous pouvez assigner des sous-routines et des fonctions aux délégués ou aux gestionnaires même lorsque leurs signatures ne sont pas identiques.

Événements (Visual Basic)

Fournit une vue d'ensemble des événements dans Visual Basic.