Contact - A propos
Skip Navigation Links.

Les événements

Descendre !

Définition
Les concepts liés aux événements
     Les abonnés
     L'événement lui-même
Exemple
     Définition des arguments d'événements
     Déclaration d'un délégué
     Déclaration des événements
     Définition des abonnés
     Raccordement aux événements

Définition

D'une façon générale, nous pouvons définir un événement comme un stimulus qui provoque une réaction. Dans le cas d'une interface graphique, le stimulus peut provenir d'une interaction entre un utilisateur (qui par exemple, clique sur un bouton) et l'interface. Les réactions peuvent être très variées: enregistrement d'un fichier, affichage d'une fenêtre, téléchargement d'un document, etc.
Les événements sont très utilisés dans les interfaces graphiques mais plus généralement, ils permettent de notifier un changement d'état. Pour aborder cette partie, il est nécessaire d'avoir assimilé le concept de délégué.

Les concepts liés aux événements

La mécanisme d'événement se décompose en deux concepts: les abonnés à l'événement et l'événement lui-même.

Les abonnés

Un abonné à un événement est prévenu à chaque fois que l'événement est déclenché. Concrètement, un abonné est une méthode qui renvoie le type void et qui possède deux arguments.
Le premier argument, de type object, se nomme sender. Il permet à l'abonné d'un événement de connaître précisément l'instance de l'objet qui a émis l'événement.
Le second argument est de type System.EventArgs. Cette classe représente la classe de base pour les classes personnalisées qui contiennent des données d'événement.

L'événement lui-même

Un événement est un membre d'une classe que l'on déclare avec le mot-clé event et à l'aide d'un délégué. Un événement est plus précisément une instance d'un délégué. Le rôle du délégué est d'encapsuler les méthodes abonnées.

Exemple

Et maintenant, rien de mieux qu'un exemple pour détailler l'implantation d'un événement.
Nous considérons un zoo ainsi qu'un responsable pour chaque famille d'animaux. Le choix d'un responsable est purement arbitraire ! L'essentiel est de fournir un exemple simple à comprendre pour illustrer le mécanisme des événements.
L'événement correspond ici à la naissance d'un animal. L'idée est simple: le responsable est appelé lorsqu'une naissance a lieu dans la famille dont il a la charge.
Pour faire la totale, nous développons également une classe personnalisée pour nos arguments d'événements.
Commençons donc par le commencement, en procédant étape par étape !

Définition des arguments d'événements

D'une façon générale, pour créer nos propres arguments d'événements, il nous faut créer une classe qui dérive de la classe System.EventArgs. Nous déclarons donc une classe NaissanceEventArgs qui hérite de EventArgs.
Cette classe contient:

  • Une méthode publique InfoNaissance qui renvoie une chaîne de caractères, le nom de l'animal.
  • Un constructeur qui initialise le nom de l'animal.
class NaissanceEventArgs: EventArgs
{
	private string animal;

	public string InfoNaissance()
	{
		return animal;
	}

	public NaissanceEventArgs(string Animal)
	{
		animal = Animal;
	}
}						

Remonter en haut de la page Descendre !

Déclaration des délégués

Nous souhaitons créer un événement. Puisqu'un événement est une instance de délégué, nous devons d'abord déclarer un délégué:

public delegate void NaissanceEventHandler(object sender, EventArgs e);

Remarque
Pour nommer ses délégués, le .NET Framework utilise la convention suivante: xxxEventHandler.
Nous adoptons le même plan de nommage. Cependant, le programmeur est libre de choisir le nom de ses délégués.

Déclaration des événements

Nous déclarons maintenant deux événements NaissanceRuminant et NaissanceFelide dans une classe Zoo.
Les méthodes NRuminant et NFelide permettent respectivement de déclencher les événements NaissanceRuminant et NaissanceFelide. Ces événements peuvent maintenant être utilisés comme des champs. Il est nécessaire de tester ces champs dans nos méthodes de déclenchement. Par exemple, dans la méthode NRuminant, nous testons le champ NaissanceRuminant. Si nous raccordons notre délégué NaissanceEventHandler à notre événement NaissanceRuminant alors NaissanceRuminant fait référence à NaissanceEventHandler. Dans le cas contraire, c'est-à-dire s'il n'existe aucun raccord, NaissanceRuminant vaut null.
D'une façon générale:

Si un délégué D est raccordé à un événement E alors E fait référence à D.
Si aucun délégué n'est raccordé à événement E alors E vaut null.

class Zoo
{
	public event NaissanceEventHandler NaissanceRuminant;
	public event NaissanceEventHandler NaissanceFelide;

	public void NRuminant(NaissanceEventArgs ne)
	{
		if (NaissanceRuminant != null)
			NaissanceRuminant(this, ne);
	}

	public void NFelide(NaissanceEventArgs ne)
	{
		if (NaissanceFelide != null)
			NaissanceFelide(this, ne);
	}
}						

Définition des abonnés

Nous déclarons une classe Responsable dans laquelle nous définissons la méthode SignalerNaissance. C'est cette méthode que nous allons abonner à nos événements NaissanceRuminant et NaissanceFelide.

class Responsable
{
	private string Nom;

	public Responsable(string nom)
	{
		Nom = nom;
	}

	public void SignalerNaissance(object sender, EventArgs e)
	{
		if (e != null)
		{
			Console.Write(Nom);
			Console.Write(" est appele(e) pour la naissance suivante: ");
			Console.WriteLine( ((NaissanceEventArgs)e).InfoNaissance() );
		}
	}
}						

Remarque
À la dernière ligne de code, nous sommes obligés de faire ce que l'on nomme un cast. Nous devons rajouter (NaissanceEventArgs) devant e pour indiquer qu'il s'agit de notre type d'événement personnalisé NaissanceEventArgs et non du type d'événement par défaut EventArgs.

Remonter en haut de la page Descendre !

Raccordement aux événements

Il ne reste plus qu'à raccorder notre délégué NaissanceEventHandler à nos événements NaissanceRuminant et NaissanceFelide. Pour réaliser cette tâche, nous utilisons l'opérateur +=. L'accès à un événement se fait de la même façon que l'accès à un champ. Ainsi, à la ligne

MonZoo.NaissanceRuminant += new NaissanceEventHandler(Alan.SignalerNaissance);

nous raccordons le délégué NaissanceEventHandler au champ NaissanceRuminant. Il en est de même pour la ligne du dessous avec le champ NaissanceFelide. Pour supprimer un délégué d'un champ, nous utilisons l'opérateur -=.
Nous pouvons maintenant utiliser nos méthodes de déclenchement d'(heureux) événements pour signaler à Alan et Julie la naissance d'une girafe et de trois lynx !

class MaClasse
{
	public static void Main()
	{
		Zoo MonZoo = new Zoo();

		Responsable Alan = new Responsable("Alan");
		Responsable Julie = new Responsable("Julie");

		MonZoo.NaissanceRuminant += new NaissanceEventHandler(Alan.SignalerNaissance);
		MonZoo.NaissanceFelide += new NaissanceEventHandler(Julie.SignalerNaissance);

		// Déclenchement des événements
		MonZoo.NRuminant( new NaissanceEventArgs("une girafe."));
		MonZoo.NFelide( new NaissanceEventArgs("trois lynx."));
	}
}						

Voici l'intégralité du code: event1.cs
Et le résultat du programme:

Quatre naissances

Les événements sur les MSDN

Mercredi 20 Juillet 2005

Remonter en haut de la page 

© C-O 2005-2008