Délégués du système de type commun (CTS, Common Type System)

Mise à jour : novembre 2007

Le runtime prend en charge les types référence qualifiés de délégués qui jouent un rôle similaire à celui des pointeurs fonction en C++. Contrairement aux pointeurs fonction, les délégués sont de type sécurisé, sûr et vérifiable. Un type délégué peut représenter n'importe quelle méthode avec une signature compatible. Alors que les pointeurs fonction peuvent uniquement représenter des fonctions statiques, un délégué peut représenter des méthodes statiques et des méthodes d'instance. Les délégués sont utilisés pour les gestionnaires d'événements et les fonctions de rappel dans le .NET Framework.

Remarque :

Le Common Language Runtime ne prend pas en charge la sérialisation de méthodes globales ; les délégués ne peuvent donc pas être utilisés pour exécuter des méthodes globales dans d'autres domaines d'application.

Tous les délégués héritent de MulticastDelegate, qui hérite de Delegate. Les langages C#, Visual Basic et C++ ne permettent pas l'héritage à partir de ces types mais fournissent à la place des mots clés pour la déclaration des délégués.

Outre les méthodes héritées, le Common Language Runtime fournit deux méthodes spéciales pour les types délégués : BeginInvoke et EndInvoke. Pour plus d'informations sur ces méthodes, consultez Appel de méthodes synchrones de façon asynchrone.

Étant donné que les délégués héritent de MulticastDelegate, un délégué dispose d'une liste d'appel, liste des méthodes représentées par le délégué et exécutées lorsque celui-ci est appelé. Toutes les méthodes de la liste reçoivent les arguments fournis lorsque le délégué est appelé.

Remarque :

La valeur de retour n'est pas définie pour un délégué dont la liste d'appel comprend plusieurs méthodes, même si le délégué dispose d'un type de retour.

Création et utilisation de délégués

Dans la plupart des cas, tels que pour les méthodes de rappel, un délégué représente une seule méthode, et les actions que vous devez réaliser se limitent à la création et l'appel du délégué.

Pour les délégués qui représentent plusieurs méthodes, le .NET Framework fournit les méthodes des classes déléguées Delegate et MulticastDelegate pour prendre en charge des opérations telles que l'ajout d'une méthode à la liste d'appel d'un délégué (méthode Delegate.Combine), la suppression d'une méthode (méthode Delegate.Remove) et l'obtention de la liste d'appel (méthode Delegate.GetInvocationList).

Remarque :

Il n'est pas nécessaire d'utiliser ces méthodes pour les délégués de gestionnaires d'événements en C#, C++ et Visual Basic car ces langages fournissent une syntaxe pour l'ajout et la suppression des gestionnaires d'événements.

Délégués static fermés et délégués d'instance ouverts

Les délégués peuvent représenter des méthodes static (Shared en Visual Basic) ou des méthodes d'instance. En général, lorsqu'un délégué représente une méthode d'instance, l'instance est liée au délégué avec la méthode. Par exemple, un délégué de gestionnaire d'événements peut disposer de trois méthodes d'instance dans sa liste d'appel, chacune faisant référence à l'objet auquel la méthode appartient.

Dans le .NET Framework version 2.0, il est également possible de créer un délégué ouvert pour une méthode d'instance. Une méthode d'instance dispose d'un paramètre d'instance implicite (représenté par this en C# ou Me en Visual Basic) et elle peut être représentée par un type délégué qui expose ce paramètre masqué. En d'autres termes, le type délégué doit disposer d'un paramètre supplémentaire au début de sa liste de paramètres formels, du même type que la classe à laquelle la méthode appartient. Le scénario inverse est également pris en charge ; il est ainsi possible de lier le premier argument d'une méthode statique.

Remarque :

La création de délégués d'instance ouverts et static fermés n'est pas directement prise en charge par Visual Basic, C++ ou C# pour les constructeurs délégués. Utilisez plutôt l'une des surcharges de méthode Delegate.CreateDelegate qui spécifie les objets MethodInfo, comme par exemple Delegate.CreateDelegate(Type, Object, MethodInfo, Boolean).

Règles assouplies pour la liaison de délégué

Dans le .NET Framework version 2.0, les types de paramètres et le type de retour d'un délégué doivent être compatibles avec les types de paramètres et le type de retour de la méthode représentée par le délégué ; la correspondance exacte entre les types n'est pas nécessaire.

Remarque :

Dans les versions 1.0 et 1.1 du .NET Framework, les types doivent correspondre exactement.

Le paramètre d'un délégué est compatible avec le paramètre correspondant d'une méthode si le type de paramètre du délégué est plus restrictif que le type de paramètre de la méthode. En effet, cela garantit qu'un argument transmis au délégué peut être transmis à la méthode en toute sécurité.

De même, le type de retour d'un délégué est compatible avec le type de retour d'une méthode si le type de retour de la méthode est plus restrictif que le type de retour du délégué, car cela garantit que le cast de la valeur de retour de la méthode peut être effectué sans risque au type de retour du délégué.

Par exemple, un délégué avec un paramètre de type Hashtable et un type de retour Object peut représenter une méthode avec un paramètre de type Object et une valeur de retour Hashtable.

Pour obtenir des informations supplémentaires ainsi qu'un code d'exemple, consultez Delegate.CreateDelegate(Type, Object, MethodInfo).

Délégués et appels de méthodes asynchrones

Chaque délégué dispose d'une méthode BeginInvoke qui vous permet de l'appeler de façon asynchrone, ainsi qu'une méthode EndInvoke qui nettoie les ressources par la suite. Ces méthodes sont générées automatiquement pour chaque type délégué. Lorsqu'un délégué est appelé à l'aide de la méthode BeginInvoke, la méthode qu'il représente est exécutée sur un thread appartenant au ThreadPool.

Pour obtenir des informations supplémentaires ainsi qu'un code d'exemple, consultez Programmation asynchrone à l'aide de délégués.

Voir aussi

Concepts

Consommation d'événements

Événements et délégués

Référence

System.Delegate

System.EventHandler

Autres ressources

Système de type commun

Programmation asynchrone à l'aide de délégués