Comment ajouter un événement à une classe
Question
Dites que j'ai une classe nommée Frog, elle ressemble à:
public class Frog
{
public int Location { get; set; }
public int JumpCount { get; set; }
public void OnJump()
{
JumpCount++;
}
}
J'ai besoin d'aide pour 2 choses:
- Je souhaite créer un événement nommé Jump dans la définition de la classe.
- Je souhaite créer une instance de la classe Frog, puis une autre méthode qui sera appelée lors du saut de Frog.
La solution
public event EventHandler Jump;
public void OnJump()
{
EventHandler handler = Jump;
if (null != handler) handler(this, EventArgs.Empty);
}
puis
Frog frog = new Frog();
frog.Jump += new EventHandler(yourMethod);
private void yourMethod(object s, EventArgs e)
{
Console.WriteLine("Frog has Jumped!");
}
Autres conseils
@CQ: Pourquoi créez-vous une copie locale pf Jump
? De plus, vous pouvez enregistrer le test suivant en modifiant légèrement la déclaration de l'événement:
public event EventHandler Jump = delegate { };
public void OnJump()
{
Jump(this, EventArgs.Empty);
}
Voici un exemple d’utilisation d’un gestionnaire d’événements normal ou d’un délégué personnalisé. Notez que ?.
est utilisé à la place de .
pour assurer que si l'événement est null, il échouera proprement (return null)
public delegate void MyAwesomeEventHandler(int rawr);
public event MyAwesomeEventHandler AwesomeJump;
public event EventHandler Jump;
public void OnJump()
{
AwesomeJump?.Invoke(42);
Jump?.Invoke(this, EventArgs.Empty);
}
Notez que l'événement lui-même n'est nul s'il n'y a pas d'abonné et qu'une fois appelé, l'événement est thread-safe. Vous pouvez donc également affecter un gestionnaire vide par défaut pour vous assurer que l'événement n'est pas nul. Notez que cela est techniquement vulnérable à ce que quelqu'un d'autre efface tous les événements (à l'aide de GetInvocationList). Utilisez-le donc avec prudence.
public event EventHandler Jump = delegate { };
public void OnJump()
{
Jump(this, EventArgs.Empty);
}