Menu
Coddy logo textTech

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

Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy. Leçon 43 sur 70.

Un délégué est un type qui représente une référence à une méthode. Considérez-le comme une variable qui contient une méthode plutôt que des données. Cela vous permet de transmettre des méthodes comme arguments, de les stocker dans des collections et de les appeler dynamiquement.

Vous déclarez un délégué en spécifiant la signature de méthode à laquelle il peut faire référence :

public delegate void Notify(string message);

public class Publisher
{
    public void SendAlert(string msg) => Console.WriteLine("Alert: " + msg);
}

// Utilisation
Notify notifier = new Publisher().SendAlert;
notifier("System started");  // Alerte : Système démarré

Les événements s'appuient sur les délégués pour implémenter le modèle publication-abonnement. Une classe déclenche un événement, et d'autres classes peuvent s'y abonner pour recevoir des notifications. Le mot-clé event restreint la manière dont le délégué peut être utilisé : les abonnés peuvent uniquement ajouter ou supprimer des gestionnaires, et non invoquer directement l'événement.

public class Button
{
    public event Action Clicked;
    
    public void Click()
    {
        Clicked?.Invoke();  // Notifier tous les abonnés
    }
}

// Abonnement
Button btn = new Button();
btn.Clicked += () => Console.WriteLine("Button was clicked!");
btn.Click();  // Le bouton a été cliqué !

L’opérateur += abonne un gestionnaire, tandis que -= le désabonne. Le modèle ?.Invoke() appelle l’événement en toute sécurité uniquement s’il y a des abonnés. Les événements sont fondamentaux dans les applications GUI, les moteurs de jeu et tout système où les objets doivent réagir aux changements sans couplage fort.

challenge icon

Défi

Facile

Construisons un système de surveillance de la température qui utilise des délégués et des événements pour notifier les abonnés chaque fois que la température change. Il s’agit d’un exemple classique du modèle publication-abonnement que les événements permettent de mettre en œuvre avec élégance.

Vous organiserez votre code sur deux fichiers :

  • TemperatureMonitor.cs : créez une classe TemperatureMonitor dans l’espace de noms Monitoring qui joue le rôle d’éditeur. Votre moniteur doit :
    • Posséder un champ privé pour stocker la température actuelle
    • Déclarer un événement utilisant Action<int> appelé TemperatureChanged, qui se déclenche chaque fois que la température est mise à jour
    • Posséder une propriété Temperature (int) dont l’accesseur set met à jour le champ privé et déclenche l’événement avec la nouvelle valeur de température
    N’oubliez pas d’utiliser le modèle ?.Invoke() pour déclencher l’événement en toute sécurité uniquement lorsqu’il y a des abonnés.
  • Program.cs : dans votre fichier principal, créez un objet TemperatureMonitor et abonnez-y deux gestionnaires différents pour son événement TemperatureChanged :
    • Un gestionnaire qui affiche : Alert: Temperature is now {value} degrees
    • Un autre gestionnaire qui affiche : Logged: {value}
    Après avoir abonné les deux gestionnaires, définissez deux fois la température en utilisant les valeurs saisies. Chaque fois que vous définissez la température, les deux gestionnaires doivent réagir.

Vous recevrez deux entrées :

  • Première valeur de température (entier)
  • Deuxième valeur de température (entier)

Par exemple, si les entrées sont 25 et 30, la sortie doit être :

Alert: Temperature is now 25 degrees
Logged: 25
Alert: Temperature is now 30 degrees
Logged: 30

Remarquez comment la définition de la propriété Temperature notifie automatiquement tous les abonnés : le moniteur n’a pas besoin de savoir qui écoute. C’est là toute la beauté de l’approche pilotée par les événements !

Essayez vous-même

using System;
using Monitoring;

class Program
{
    public static void Main(string[] args)
    {
        // Lire l'entrée
        int temp1 = Convert.ToInt32(Console.ReadLine());
        int temp2 = Convert.ToInt32(Console.ReadLine());

        // TODO: Créer une instance de TemperatureMonitor

        // TODO: Subscribe a handler that prints: "Alert: Temperature is now {value} degrees"

        // TODO: S'abonner à un autre gestionnaire qui affiche : "Logged: {value}"

        // TODO: Définir la température à temp1

        // TODO: Définir la température à temp2
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur C# en ligne