Langage C# – Permettre à vos objets de communiquer grâce aux évènements

Présentation
Le langage C# propose un mécanisme permettant à des objets, qui ne se connaissent pas obligatoirement lors de l’exécution d’une application, de pouvoir communiquer : les évènements. Ce mécanisme repose sur deux « objets acteurs » :

  • Un premier objet qui définit et lève un évènement.
  • Un second objet qui abonne une de ses méthodes à l’évènement pour qu’elle soit exécutée automatiquement lorsque l’évènement est levé.

Définition et levée de l’évènement
Voici les étapes à réaliser :

  • Définition de l’évènement
  • Création d’une méthode de levée d’évènement
  • Appel de la méthode de levée d’évènement

Pourquoi créer une méthode de levée d’évènement ? Pour deux raisons :

  • Une classe ne peut lever que les évènements qu’elle définit. Les autres classes ne peuvent lever un évènement qu’en faisant appel à cette méthode.
  • Avant de lever un évènement, il est impératif de vérifier qu’une méthode a été abonnée à l’évènement. Car lever un évènement sans qu’une méthode n’y ait été préalablement abonnée provoque la levée d’une exception de type NullReferenceException.

Voici l’implémentation :
[cc lang= »csharp »]
public class Moteur
{

// Evènement.
public event Action EvtEtatChanged;

// Méthode de levée de l’évènement.
public void OnEvtEtatChanged()
{
if (this.EvtEtatChanged != null)
{
// Levée de l’évènement.
this.EvtEtatChanged.Invoke(this);
}
}

private bool _EstDemarre;
public bool EstDemarre
{
get => _EstDemarre;
set
{
bool bEtatChanged = this._EstDemarre != value;

if (bEtatChanged)
{
this._EstDemarre = value;

// Lever de l’évènement.
this.OnEvtEtatChanged();
}
}
}

// Autres membres …

}
[/cc]

Quelques remarques :

  • Lors de la déclaration de l’évènement, le délégué Action permet de définir la signature de l’évènement (il est aussi possible d’utiliser le délégué Func) et d’indiquer les données qui seront communiquées à la méthode qui sera abonnée à l’évènement. Dans cet exemple, nous indiquons le moteur dont l’état a changé.
  • Lors de la levée de l’évènement, il faut respecter la signature de ce même délégué et fournir le moteur (l’objet courant qui lève l’évènement).

Abonnement à l’évènement
Pour s’abonner à l’évènement, il est nécessaire de créer une méthode dont la signature respecte la signature du délégué ayant été utilisé pour définir l’évènement :
[cc lang= »csharp »]
private void Moteur_EvtEtatChanged(Moteur obj)
{
// Bloc de code.
}
[/cc]

Et pour s’y abonner :
[cc lang= »csharp »]
Moteur moteur = new Moteur();
moteur.EvtEtatChanged += Moteur_EvtEtatChanged;
[/cc]

Ainsi, lorsque l’évènement EvtEtatChanged est levé dans la classe Moteur, la méthode Moteur_EvtEtatChanged est automatiquement exécutée.

Étiquettes :

About: James RAVAILLE

Travaillant avec la plateforme Microsoft .NET depuis 2002, j'alterne les missions de formation et d'ingénierie avec cette plateforme. J'écris ce blog pour transmettre mes connaissances à tout développeur, qu'il soit débutant ou expérimenté.