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:

  1. Je souhaite créer un événement nommé Jump dans la définition de la classe.
  2. Je souhaite créer une instance de la classe Frog, puis une autre méthode qui sera appelée lors du saut de Frog.
Était-ce utile?

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top