web-dev-qa-db-fra.com

Comment ajouter un événement à une classe

Disons 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 avec 2 choses:

  1. Je souhaite créer un événement nommé Jump dans la définition de la classe.
  2. Je veux créer une instance de la classe Frog, puis une autre méthode qui sera appelée lorsque Frog saute.
37
public static
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!");
}
55
Quintin Robinson

@CQ: Pourquoi créez-vous une copie locale de Jump? En outre, 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);
}
1
Konrad Rudolph

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 (retourne 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 aucun 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 à une autre personne qui efface tous les événements (à l'aide de GetInvocationList). Utilisez-le avec prudence.

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}
0
Tezra