Comment s’abonner à des événements et s’en désabonner (Guide de programmation C#)
Vous vous abonnez à un événement publié par une autre classe lorsque vous voulez écrire du code personnalisé qui doit être appelé quand cet événement est déclenché. Par exemple, vous pouvez vous abonner à l’événement click
d’un bouton pour permettre à votre application de réagir lorsque l’utilisateur clique sur le bouton.
Pour s’abonner aux événements à l’aide de l’IDE de Visual Studio
Si vous ne voyez pas la fenêtre Propriétés, en mode Création, cliquez sur le formulaire ou le contrôle pour lequel vous voulez créer un gestionnaire d’événements, puis sélectionnez Propriétés.
En haut de la fenêtre Propriétés, cliquez sur l’icône Événements.
Double-cliquez sur l’événement que vous voulez créer, par exemple l’événement
Load
.Visual C# crée une méthode de gestionnaire d’événements vide et l’ajoute à votre code. Vous pouvez également ajouter le code manuellement en mode Code. Par exemple, les lignes de code suivantes déclarent une méthode de gestionnaire d’événements qui est appelée lorsque la classe
Form
déclenche l’événementLoad
.private void Form1_Load(object sender, System.EventArgs e) { // Add your form load event handling code here. }
La ligne de code qui est nécessaire pour s’abonner à l’événement est aussi générée automatiquement dans la méthode
InitializeComponent
, dans le fichier Form1.Designer.cs de votre projet. Elle ressemble à ceci :this.Load += new System.EventHandler(this.Form1_Load);
Pour s’abonner aux événements par programmation
Définissez une méthode de gestionnaire d’événements dont la signature correspond à la signature du délégué de l’événement. Par exemple, si l’événement est basé sur le type délégué EventHandler, le code suivant représente le stub de méthode :
void HandleCustomEvent(object sender, CustomEventArgs a) { // Do something useful here. }
Utilisez l’opérateur d’affectation d’addition (
+=
) pour attacher un gestionnaire d’événements à l’événement. Dans l’exemple suivant, nous allons supposer qu’un objet nommépublisher
a un événement nomméRaiseCustomEvent
. Notez que la classe d’abonné nécessite une référence à la classe d’éditeur pour s’abonner à ses événements.publisher.RaiseCustomEvent += HandleCustomEvent;
Vous pouvez également utiliser une expression lambda pour spécifier un gestionnaire d’événements :
public Form1() { InitializeComponent(); this.Click += (s,e) => { MessageBox.Show(((MouseEventArgs)e).Location.ToString()); }; }
Pour s’abonner aux événements à l’aide d’une fonction anonyme
Si vous n’avez pas besoin de vous désabonner d’un événement ultérieurement, vous pouvez utiliser l’opérateur d’assignation d’addition (+=
) pour attacher une fonction anonyme en tant que gestionnaire d’événements. Dans l’exemple suivant, nous supposons qu’un objet nommé publisher
a un événement nommé RaiseCustomEvent
, et qu’une classe CustomEventArgs
a également été définie pour contenir des informations d’événements spécialisés. Notez que la classe d’abonné nécessite une référence à publisher
pour s’abonner à ses événements.
publisher.RaiseCustomEvent += (object o, CustomEventArgs e) =>
{
string s = o.ToString() + " " + e.ToString();
Console.WriteLine(s);
};
Vous ne pouvez pas vous désabonner facilement d’un événement si vous avez utilisé une fonction anonyme pour vous y inscrire. Pour vous désabonner dans ce scénario, accédez au code dans lequel vous vous êtes abonné à l’événement, stockez la fonction anonyme dans une variable de délégué, puis ajoutez le délégué à l’événement. Nous recommandons de ne pas utiliser de fonctions anonymes pour vous abonner aux événements si vous devez vous en désabonner plus tard dans votre code. Pour plus d’informations sur les fonctions anonymes, consultez Expressions lambda.
Désabonnement
Pour éviter que votre gestionnaire d’événements ne soit appelé lorsque l’événement est déclenché, désabonnez-vous de l’événement. Pour empêcher les fuites de ressources, vous devez vous désabonner des événements avant d’éliminer un objet d’abonné. Tant que vous êtes abonné à un événement, le délégué de multidiffusion qui se trouve sous l’événement, dans l’objet de publication, comporte une référence au délégué qui encapsule le gestionnaire d’événements de l’abonné. Tant que l’objet de publication contient cette référence, le garbage collection ne supprime pas l’objet d’abonné.
Pour se désabonner d’un événement
Utilisez l’opérateur d’assignation de soustraction (
-=
) pour vous désabonner d’un événement :publisher.RaiseCustomEvent -= HandleCustomEvent;
Lorsque tous les abonnés se sont désabonnés d’un événement, l’instance d’événement de la classe d’éditeur est définie sur
null
.