it-swarm.it

Come aggiungere un evento a una classe

Diciamo che ho una classe chiamata Frog, sembra che:

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


     public void OnJump()
     {
         JumpCount++;
     }

}

Ho bisogno di aiuto con 2 cose:

  1. Voglio creare un evento chiamato Jump nella definizione della classe.
  2. Voglio creare un'istanza della classe Frog e quindi creare un altro metodo che verrà chiamato quando salterà il Rana.
37
public static
public event EventHandler Jump;
public void OnJump()
{
    EventHandler handler = Jump;
    if (null != handler) handler(this, EventArgs.Empty);
}

poi

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: Perché crei una copia locale di Jump? Inoltre, puoi salvare il test successivo cambiando leggermente la dichiarazione dell'evento:

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}
1
Konrad Rudolph

Ecco un esempio di come utilizzare un normale EventHandler o un delegato personalizzato. Si noti che ?. è usato al posto di . per assicurare che se l'evento è nullo, fallirà in modo pulito (restituisce 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);
}

Si noti che l'evento stesso è nullo se non ci sono abbonati e che una volta invocato, l'evento è thread-safe. Quindi puoi anche assegnare un gestore vuoto predefinito per assicurare che l'evento non sia nullo. Si noti che questo è tecnicamente vulnerabile a qualcun altro che cancella tutti gli eventi (utilizzando GetInvocationList), quindi utilizzare con cautela.

public event EventHandler Jump = delegate { };

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