Partager via


Délégués et opérateur AddressOf

Mise à jour : novembre 2007

Les délégués sont des objets que vous pouvez utiliser pour appeler les méthodes d'autres objets. 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 génère les événements ne peut pas savoir au préalable quel gestionnaire d'événements gère un événement spécifique. Visual Basic vous laisse associer de manière dynamique des gestionnaires d'événements à des événements en créant un délégué à votre intention 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 de délégué. Par exemple, les deux lignes de code suivantes sont équivalentes :

AddHandler Button1.Click, AddressOf Me.Button1_Click
' The previous line of code is shorthand for the next line of code.
AddHandler Button1.Click, New EventHandler(AddressOf 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, par exemple pour le traitement dissocié des threads ou pour des procédures impliquant d'appeler différentes versions de fonctions au moment de la compilation.

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.

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

La signature de la fonction doit correspondre à celle du type délégué. Pour plus d'informations sur les expressions lambda, consultez Expressions lambda.

Voir aussi

Tâches

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

Comment : appeler une méthode déléguée

Comment : écrire des gestionnaires d'événements

Concepts

Expressions lambda

Événements et gestionnaires d'événements

AddHandler et RemoveHandler

Applications multithread

Référence

Delegate, instruction

AddressOf, opérateur