Gestion et déclenchement d'événementsHandling and raising events

Les événements dans .NET Framework sont basés sur le modèle délégué.Events in .NET are based on the delegate model. Le modèle délégué suit le modèle de conception observateur, qui permet à un abonné de s'inscrire pour recevoir des notifications d'un fournisseur.The delegate model follows the observer design pattern, which enables a subscriber to register with and receive notifications from a provider. Un émetteur d'événements émet une notification d'événement, et un récepteur d'événements reçoit cette notification et définit une réponse à celle-ci.An event sender pushes a notification that an event has happened, and an event receiver receives that notification and defines a response to it. Cet article décrit les principaux composants du modèle délégué, comment consommer les événements des applications, et comment implémenter des événements dans votre code.This article describes the major components of the delegate model, how to consume events in applications, and how to implement events in your code.

Pour plus d’informations sur la gestion des événements dans les applications Windows 8.x Store, consultez Vue d’ensemble des événements et des événements routés.For information about handling events in Windows 8.x Store apps, see Events and routed events overview.

ÉvénementsEvents

Un événement est un message envoyé par un objet pour signaler la présence d’une action.An event is a message sent by an object to signal the occurrence of an action. L'action peut être provoquée par l'intervention de l'utilisateur, telle qu'un clic de bouton, ou être déclenchée par une autre logique de programme, comme la modification d’une valeur de propriété.The action can be caused by user interaction, such as a button click, or it can result from some other program logic, such as changing a property’s value. L’objet qui déclenche l’événement est appelé l’émetteur d’événements.The object that raises the event is called the event sender. L'émetteur d'événements ne connaît pas l'objet, ni la méthode qui recevront (géreront) les événements qu'il déclenche.The event sender doesn't know which object or method will receive (handle) the events it raises. L'événement est généralement un membre de l'émetteur d'événements ; par exemple, l'événement Click est membre de la classe Button, et l'événement PropertyChanged est membre de la classe qui implémente l'interface INotifyPropertyChanged.The event is typically a member of the event sender; for example, the Click event is a member of the Button class, and the PropertyChanged event is a member of the class that implements the INotifyPropertyChanged interface.

Pour définir un événement, vous utilisez le mot clé C# event Visual Basic Event dans la signature de votre classe d'événements, puis vous spécifiez le type de délégué pour l'événement.To define an event, you use the C# event or the Visual Basic Event keyword in the signature of your event class, and specify the type of delegate for the event. Les délégués sont décrits dans la section suivante.Delegates are described in the next section.

En général, pour déclencher un événement, ajoutez une méthode qui est marquée comme protected et virtual (C#) ou Protected et Overridable (en Visual Basic).Typically, to raise an event, you add a method that is marked as protected and virtual (in C#) or Protected and Overridable (in Visual Basic). Nommez cette méthode OnEventName ; par exemple, OnDataReceived.Name this method OnEventName; for example, OnDataReceived. La méthode doit prendre un paramètre qui spécifie un objet de données d'événement, qui est un objet de type EventArgs ou un type dérivé.The method should take one parameter that specifies an event data object, which is an object of type EventArgs or a derived type. Vous fournissez cette méthode pour permettre aux classes dérivées de substituer la logique de déclenchement d'événement.You provide this method to enable derived classes to override the logic for raising the event. Une classe dérivée doit toujours appeler la méthode OnEventName de la classe de base pour garantir que les délégués inscrits reçoivent l’événement.A derived class should always call the OnEventName method of the base class to ensure that registered delegates receive the event.

L'exemple suivant montre comment déclarer un évènement appelé ThresholdReached.The following example shows how to declare an event named ThresholdReached. L'événement est associé au délégué EventHandler et déclenché dans une méthode nommée OnThresholdReached.The event is associated with the EventHandler delegate and raised in a method named OnThresholdReached.

class Counter
{
    public event EventHandler ThresholdReached;

    protected virtual void OnThresholdReached(EventArgs e)
    {
        EventHandler handler = ThresholdReached;
        handler?.Invoke(this, e);
    }

    // provide remaining implementation for the class
}
Public Class Counter
    Public Event ThresholdReached As EventHandler

    Protected Overridable Sub OnThresholdReached(e As EventArgs)
        RaiseEvent ThresholdReached(Me, e)
    End Sub

    ' provide remaining implementation for the class
End Class

DéléguésDelegates

Un délégué est un type qui détient une référence à une méthode.A delegate is a type that holds a reference to a method. Un délégué est déclaré avec une signature qui indique le type de retour et les paramètres des méthodes qu'il référence, et il peut contenir des références à des méthodes qui correspondent à sa signature.A delegate is declared with a signature that shows the return type and parameters for the methods it references, and it can hold references only to methods that match its signature. Un délégué est donc équivalent à un rappel ou un pointeur de fonction de type sécurisé.A delegate is thus equivalent to a type-safe function pointer or a callback. Une déclaration Delegate suffit à définir une classe déléguée.A delegate declaration is sufficient to define a delegate class.

Les délégués ont de nombreux usages dans .NET.Delegates have many uses in .NET. Dans le contexte des événements, un délégué est un intermédiaire (ou un mécanisme similaire aux pointeurs) entre la source d'événements et le code qui gère l'événement.In the context of events, a delegate is an intermediary (or pointer-like mechanism) between the event source and the code that handles the event. Vous associez un délégué à un événement en incluant le type de délégué dans la déclaration de l'événement, comme indiqué dans l'exemple de la section précédente.You associate a delegate with an event by including the delegate type in the event declaration, as shown in the example in the previous section. Pour plus d'informations sur les délégués, consultez la classe Delegate.For more information about delegates, see the Delegate class.

.NET fournit les délégués EventHandler et EventHandler<TEventArgs> pour prendre en charge la plupart des scénarios d'événement..NET provides the EventHandler and EventHandler<TEventArgs> delegates to support most event scenarios. Utilisez le délégué EventHandler pour tous les événements qui n'incluent pas de données d'événement.Use the EventHandler delegate for all events that do not include event data. Utilisez le délégué EventHandler<TEventArgs> pour les événements qui incluent des données sur l'événement.Use the EventHandler<TEventArgs> delegate for events that include data about the event. Ces délégués n’ont aucune valeur de type de retour et prennent deux paramètres (un objet pour la source de l’événement et un objet pour les données d’événement).These delegates have no return type value and take two parameters (an object for the source of the event, and an object for event data).

Les délégués sont multidiffusion, ce qui signifie qu'ils peuvent contenir des références à plusieurs méthodes de gestion des événements.Delegates are multicast, which means that they can hold references to more than one event-handling method. Pour plus d'informations, consultez la page de référence Delegate.For details, see the Delegate reference page. Les délégués assurent une souplesse et un contrôle précis lors de la gestion des événements.Delegates provide flexibility and fine-grained control in event handling. Un délégué agit comme un répartiteur d’événements pour la classe qui déclenche l’événement en gérant une liste de gestionnaires d’événements inscrits pour l’événement.A delegate acts as an event dispatcher for the class that raises the event by maintaining a list of registered event handlers for the event.

Pour les scénarios dans lesquels les délégués EventHandler et EventHandler<TEventArgs> ne fonctionnent pas, vous pouvez définir un délégué.For scenarios where the EventHandler and EventHandler<TEventArgs> delegates do not work, you can define a delegate. Les scénarios qui nécessitent de définir un délégué sont très rares, par exemple lorsque vous devez utiliser du code qui ne reconnaît pas les génériques.Scenarios that require you to define a delegate are very rare, such as when you must work with code that does not recognize generics. Vous marquez un délégué avec le mot clé C# delegateet Visual Basic Delegate dans la déclaration.You mark a delegate with the C# delegate and Visual Basic Delegate keyword in the declaration. L'exemple suivant montre comment déclarer un délégué nommé ThresholdReachedEventHandler.The following example shows how to declare a delegate named ThresholdReachedEventHandler.

public delegate void ThresholdReachedEventHandler(object sender, ThresholdReachedEventArgs e);
Public Delegate Sub ThresholdReachedEventHandler(sender As Object, e As ThresholdReachedEventArgs)

Données d'événementEvent data

Les données associées à un événement peuvent être obtenues via une classe de données d'événement.Data that is associated with an event can be provided through an event data class. .NET fournit plusieurs classes de données d'événement que vous pouvez utiliser dans vos applications..NET provides many event data classes that you can use in your applications. Par exemple, la classe SerialDataReceivedEventArgs est la classe de données d'événement pour l'événement SerialPort.DataReceived.For example, the SerialDataReceivedEventArgs class is the event data class for the SerialPort.DataReceived event. .NET suit un modèle d'affectation de nom qui veut que toutes les classes de données d'évènement se terminent par EventArgs..NET follows a naming pattern of ending all event data classes with EventArgs. Pour savoir quelle classe de données d'événement est associée à un événement, il suffit d'examiner le délégué de l'événement.You determine which event data class is associated with an event by looking at the delegate for the event. Par exemple, le délégué SerialDataReceivedEventHandler inclut la classe SerialDataReceivedEventArgs comme paramètre.For example, the SerialDataReceivedEventHandler delegate includes the SerialDataReceivedEventArgs class as one of its parameters.

La classe EventArgs est le type de base pour toutes les classes de données d'événement.The EventArgs class is the base type for all event data classes. EventArgs est également la classe que vous utilisez quand un événement n'a pas de données associée.EventArgs is also the class you use when an event does not have any data associated with it. Lorsque vous créez un événement qui vise uniquement à notifier à d'autres classes que quelque chose est survenu et n'a pas besoin de passer des données, incluez la classe EventArgs comme deuxième paramètre du délégué.When you create an event that is only meant to notify other classes that something happened and does not need to pass any data, include the EventArgs class as the second parameter in the delegate. Vous pouvez passer la valeur EventArgs.Empty lorsqu'aucune donnée n'est fournie.You can pass the EventArgs.Empty value when no data is provided. Le délégué EventHandler inclut la classe EventArgs comme paramètre.The EventHandler delegate includes the EventArgs class as a parameter.

Lorsque vous souhaitez créer une classe personnalisée de données d'événement, créez une classe qui dérive de EventArgs, puis fournissez tous les membres requis pour passer les données liées à l'événement.When you want to create a customized event data class, create a class that derives from EventArgs, and then provide any members needed to pass data that is related to the event. En général, vous devriez utiliser le même modèle d'affectation de noms que .NET et terminer le nom de classe de données d'événement par EventArgs.Typically, you should use the same naming pattern as .NET and end your event data class name with EventArgs.

L'exemple suivant illustre une classe de données d'événement nommée ThresholdReachedEventArgs.The following example shows an event data class named ThresholdReachedEventArgs. Elle contient les propriétés spécifiques à l'événement déclenché.It contains properties that are specific to the event being raised.

public class ThresholdReachedEventArgs : EventArgs
{
    public int Threshold { get; set; }
    public DateTime TimeReached { get; set; }
}
Public Class ThresholdReachedEventArgs
    Inherits EventArgs

    Public Property Threshold As Integer
    Public Property TimeReached As DateTime
End Class

Gestionnaires d’événementsEvent handlers

Pour répondre à un événement, vous définissez une méthode de gestion d'événements dans le récepteur d'événements.To respond to an event, you define an event handler method in the event receiver. Cette méthode doit correspondre à la signature du délégué pour l'événement géré.This method must match the signature of the delegate for the event you are handling. Dans le gestionnaire des évènements, vous exécutez les actions nécessaires lorsque l'événement est déclenché, comme la collecte de l'entrée d'utilisateur après que l'utilisateur clique sur un bouton.In the event handler, you perform the actions that are required when the event is raised, such as collecting user input after the user clicks a button. Pour recevoir des notifications lorsque l'événement se produit, la méthode de votre gestionnaire d'événements doit s'abonner à l'événement.To receive notifications when the event occurs, your event handler method must subscribe to the event.

L'exemple suivant présente une méthode de gestionnaire d'événements nommée c_ThresholdReached qui correspond à la signature du délégué EventHandler.The following example shows an event handler method named c_ThresholdReached that matches the signature for the EventHandler delegate. La méthode s'abonne à l'événement ThresholdReached.The method subscribes to the ThresholdReached event.

class Program
{
    static void Main()
    {
        var c = new Counter();
        c.ThresholdReached += c_ThresholdReached;

        // provide remaining implementation for the class
    }

    static void c_ThresholdReached(object sender, EventArgs e)
    {
        Console.WriteLine("The threshold was reached.");
    }
}
Module Module1

    Sub Main()
        Dim c As New Counter()
        AddHandler c.ThresholdReached, AddressOf c_ThresholdReached

        ' provide remaining implementation for the class
    End Sub

    Sub c_ThresholdReached(sender As Object, e As EventArgs)
        Console.WriteLine("The threshold was reached.")
    End Sub
End Module

Gestionnaires d’événements statiques et dynamiquesStatic and dynamic event handlers

.NET permet aux abonnés de s’inscrire pour les notifications d’événements statiques ou dynamiques..NET allows subscribers to register for event notifications either statically or dynamically. Les gestionnaires d’événements statiques sont en vigueur pendant toute la durée de vie de la classe dont ils gèrent les événements.Static event handlers are in effect for the entire life of the class whose events they handle. Les gestionnaires d’événements dynamiques sont explicitement activés et désactivés pendant l’exécution du programme, généralement en réponse à une logique de programme conditionnelle.Dynamic event handlers are explicitly activated and deactivated during program execution, usually in response to some conditional program logic. Par exemple, ils peuvent être utilisés si les notifications d’événements sont nécessaires uniquement dans certaines conditions ou si une application fournit plusieurs gestionnaires d’événements et les conditions d’exécution définissent le gestionnaire approprié à utiliser.For example, they can be used if event notifications are needed only under certain conditions or if an application provides multiple event handlers and run-time conditions define the appropriate one to use. L'exemple de la section précédente indique comment ajouter dynamiquement un gestionnaire d'événements.The example in the previous section shows how to dynamically add an event handler. Pour plus d’informations, consultez Événements (en Visual Basic) et Événements (en C#).For more information, see Events (in Visual Basic) and Events (in C#).

Déclenchement de plusieurs événementsRaising multiple events

Si votre classe déclenche plusieurs événements, le compilateur génère un champ par instance de délégué d'événement.If your class raises multiple events, the compiler generates one field per event delegate instance. Si le nombre d’événements est important, le coût de stockage d’un champ par délégué peut ne pas convenir.If the number of events is large, the storage cost of one field per delegate may not be acceptable. Dans ce cas, .NET fournit les propriétés de l’événement que vous pouvez utiliser avec une autre structure de données de votre choix pour stocker les délégués d’événements.For those situations, .NET provides event properties that you can use with another data structure of your choice to store event delegates.

Les propriétés de l’événement se composent de déclarations d’événement accompagnées d’accesseurs d’événement.Event properties consist of event declarations accompanied by event accessors. Les accesseurs d'événement sont des méthodes que vous définissez pour que des instances de délégué d'événement puissent être ajoutées ou supprimées de la structure des données de stockage.Event accessors are methods that you define to add or remove event delegate instances from the storage data structure. Notez que les propriétés d'événement sont plus lentes que les champs d'événement, car chaque délégué d'événement doit être récupéré avant de pouvoir être appelé.Note that event properties are slower than event fields, because each event delegate must be retrieved before it can be invoked. Le compromis réside entre la mémoire et la vitesse.The trade-off is between memory and speed. Si votre classe définit de nombreux événements qui sont déclenchés peu fréquemment, vous souhaiterez implémenter les propriétés de l’événement.If your class defines many events that are infrequently raised, you will want to implement event properties. Pour plus d'informations, voir Procédure : Gérer plusieurs événements à l'aide de propriétés d'événements.For more information, see How to: Handle Multiple Events Using Event Properties.

TitreTitle DescriptionDescription
Guide pratique pour déclencher et utiliser des événementsHow to: Raise and Consume Events Contient des exemples de déclenchement et de consommation d'événements.Contains examples of raising and consuming events.
Guide pratique pour gérer plusieurs événements à l'aide de propriétés d'événementsHow to: Handle Multiple Events Using Event Properties Montre comment utiliser des propriétés d'événement pour gérer plusieurs événements.Shows how to use event properties to handle multiple events.
Modèle de conception ObservateurObserver Design Pattern Décrit le modèle de conception qui permet à un abonné de s’inscrire pour recevoir des notifications d’un fournisseur.Describes the design pattern that enables a subscriber to register with, and receive notifications from, a provider.
Guide pratique pour consommer des événements dans une application Web FormsHow to: Consume Events in a Web Forms Application Montre comment gérer un événement déclenché par un contrôle Web Forms.Shows how to handle an event that is raised by a Web Forms control.

Voir aussiSee also