Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 similaires 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 référencer les deux méthodes partagées ( méthodes qui peuvent être appelées sans instance spécifique d’une classe) et les 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 souhaiterez peut-être qu’un objet qui déclenche des événements puisse appeler différents gestionnaires d’événements dans différentes circonstances. Malheureusement, l’objet qui déclenche les événements ne peut pas connaître à l’avance quel gestionnaire d’événements gère un événement spécifique. Visual Basic vous permet d’associer dynamiquement des gestionnaires d’événements à des événements en créant un délégué pour vous lorsque vous utilisez l’instruction AddHandler
. Au moment de l’exécution, le délégué transfère 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 prend soin des détails pour vous. Par exemple, une Event
instruction définit implicitement une classe déléguée nommée <EventName>EventHandler
en tant que classe imbriquée de la classe contenant l’instruction Event
et 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 en tant qu’argument. La deuxième ligne est un moyen plus pratique 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 méthode abrégée de création de délégués partout où le compilateur peut déterminer le type du délégué par le contexte.
Déclaration d’événements qui utilisent un type délégué existant
Dans certaines situations, vous pouvez déclarer un événement pour utiliser un type de délégué existant comme délégué sous-jacent. La syntaxe suivante montre comment :
Delegate Sub DelegateType()
Event AnEvent As DelegateType
Cela est utile lorsque vous souhaitez acheminer plusieurs événements vers le même gestionnaire.
Déléguer des variables et des paramètres
Vous pouvez utiliser des délégués pour d’autres tâches non liées à l’événement, telles que le thread libre ou avec des procédures qui doivent appeler différentes versions de fonctions au moment de l’exécution.
Par exemple, supposons que vous disposez d’une application de publicité classifiée qui inclut une zone de liste avec les noms des voitures. Les annonces sont triées par titre, ce qui est normalement la marque de la voiture. Un problème que vous pouvez rencontrer se produit quand certaines voitures incluent l’année de la voiture avant la marque. Le problème réside dans le fait que la fonction de tri intégrée du champ de liste trie uniquement par codes de caractères ; elle place toutes les annonces commençant par des dates en premier, suivies des annonces commençant 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 peut basculer au moment de l’exécution vers la procédure de tri personnalisée pour les publicités 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.
AddressOf et expressions lambda
Chaque classe de délégué définit un constructeur à qui est passée la spécification d'une méthode d'objet. Un 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 au moment de la compilation du expression
doit être le nom d'une classe ou d'une interface qui contient une méthode du nom spécifié dont la signature correspond à la signature de la classe du délégué. Le methodName
peut être soit une méthode partagée, soit une méthode d’instance. Ce 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 , parm2
As type2
type
, ...])expression
L’exemple suivant montre à la fois les AddressOf
et les expressions lambda 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 davantage d’exemples d’expressions lambda et d'affectations aux délégués, consultez AddressOf
.
Rubriques connexes
Titre | Descriptif |
---|---|
Guide pratique : appeler une méthode déléguée | Fournit un exemple qui montre comment associer une méthode à un délégué, puis appeler cette méthode par le biais du délégué. |
Procédure : passer des procédures à une autre procédure en Visual Basic | Montre comment utiliser des délégués pour passer une procédure à une autre procédure. |
Conversion de délégué assouplie | Décrit comment attribuer des sous-fonctions à des délégués ou des gestionnaires même si leurs signatures ne sont pas identiques |
Événements | Fournit une vue d’ensemble des événements en Visual Basic. |