2008-09-17 9 views
29

Dire que j'ai une classe nommée grenouille, il ressemble à:Comment ajouter un événement à une classe

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 veux créer un événement nommé Sautez dans la définition de classe.
  2. Je veux créer une instance de la classe Frog, puis créer une autre méthode qui sera appelée lorsque la grenouille sautera.

Répondre

47
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!"); 
} 
+1

merci, bien que je ne vois pas le besoin de cette ligne "EventHandler handler = Jump;" –

+7

Ceci est pour éviter les gestionnaires morts .. dans C# entre le moment où vous vérifiez si un gestionnaire est nul et l'heure réelle d'appeler le gestionnaire, la méthode aurait pu être supprimée. Vous définissez donc une référence à l'endroit où le gestionnaire pointe actuellement, puis recherchez null sur cette référence et invoquez-le. –

+0

Le premier fragment de code serait-il une chose à portée globale statique? Sinon, comment sait-elle ce que frog.Jump fait? – WDUK

0

@CQ: Pourquoi voulez-vous créer une copie locale Jump PF? 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); 
} 
+2

La création de la copie locale est une technique défensive qui empêche l'exécution d'une exception si le gestionnaire est supprimé avant de pouvoir s'exécuter. –

+4

En outre, si vous ne vérifiez pas null, vous obtiendrez une exception NullReferenceException s'il n'y a aucun gestionnaire d'événements attaché à l'événement lors de l'appel de Jump (this, EventArgs.Empty); –

+1

Scott, vous attribuez une référence ici, donc cette "technique défensive" est complètement inutile. –

Questions connexes