2008-09-17 15 views
29

Decir que tengo una clase llamada rana, que parece:Cómo añadir un evento a una clase

public class Frog 
{ 
    public int Location { get; set; } 
    public int JumpCount { get; set; } 


    public void OnJump() 
    { 
     JumpCount++; 
    } 

} 

Necesito ayuda con 2 cosas:

  1. Quiero crear un evento denominado Salta en la definición de la clase.
  2. Quiero crear una instancia de la clase Frog y luego crear otro método que se invocará cuando salte la rana.

Respuesta

47
public event EventHandler Jump; 
public void OnJump() 
{ 
    EventHandler handler = Jump; 
    if (null != handler) handler(this, EventArgs.Empty); 
} 

continuación

Frog frog = new Frog(); 
frog.Jump += new EventHandler(yourMethod); 

private void yourMethod(object s, EventArgs e) 
{ 
    Console.WriteLine("Frog has Jumped!"); 
} 
+1

gracias, aunque no veo la necesidad de esta línea "Manejador de EventHandler = Jump;" –

+7

esto es para evitar manipuladores muertos ... en C# entre el momento en que comprueba si un controlador es nulo y el momento real para invocar al controlador, el método podría haberse eliminado. Así que configura una referencia hacia donde el manejador está apuntando actualmente, luego verifica null en esa referencia e invoca. –

+0

¿Sería el primer fragmento de código una cosa de alcance global estática? De lo contrario, ¿cómo sabe qué rana.Jump hace? – WDUK

0

@CQ: ¿Por qué se crea una copia local PF Jump? Además, puede guardar la prueba subsiguiente cambiando ligeramente la declaración del evento:

public event EventHandler Jump = delegate { }; 

public void OnJump() 
{ 
    Jump(this, EventArgs.Empty); 
} 
+2

La creación de la copia local es una técnica defensiva que evita que ocurra una excepción si se elimina el controlador antes de que realmente tenga la oportunidad de ejecutarse. –

+4

Además, si no comprueba null, obtendrá una NullReferenceException si no hay controladores de eventos conectados al evento al llamar a Jump (esto, EventArgs.Empty); –

+1

Scott, estás asignando una referencia aquí, por lo que esta "técnica defensiva" es completamente inútil. –

Cuestiones relacionadas