it-swarm-eu.dev

So fügen Sie einer Klasse ein Ereignis hinzu

Angenommen, ich habe eine Klasse mit dem Namen Frosch, die wie folgt aussieht:

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


     public void OnJump()
     {
         JumpCount++;
     }

}

Ich brauche Hilfe bei zwei Dingen:

  1. Ich möchte ein Ereignis mit dem Namen Jump in der Klassendefinition erstellen.
  2. Ich möchte eine Instanz der Frog-Klasse erstellen und dann eine andere Methode erstellen, die aufgerufen wird, wenn der Frog springt.
37
public static
public event EventHandler Jump;
public void OnJump()
{
    EventHandler handler = Jump;
    if (null != handler) handler(this, EventArgs.Empty);
}

dann

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

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

@CQ: Warum erstellen Sie eine lokale Kopie von Jump? Darüber hinaus können Sie den nachfolgenden Test speichern, indem Sie die Deklaration des Ereignisses geringfügig ändern:

public event EventHandler Jump = delegate { };

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

Hier ein Beispiel, wie ein normaler EventHandler oder ein benutzerdefinierter Delegat verwendet wird. Beachten Sie, dass ?. anstelle von . verwendet wird, um sicherzustellen, dass das Ereignis bei einem NULL-Ereignis fehlerhaft fehlschlägt (NULL zurückgeben).

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);
}

Beachten Sie, dass das Ereignis selbst nur null ist, wenn keine Abonnenten vorhanden sind, und dass das Ereignis, sobald es aufgerufen wird, threadsicher ist. Sie können also auch einen leeren Standard-Handler zuweisen, um sicherzustellen, dass das Ereignis nicht null ist. Beachten Sie, dass dies technisch anfällig für das Löschen aller Ereignisse durch eine andere Person ist (mithilfe von GetInvocationList). Verwenden Sie diese Option daher mit Vorsicht.

public event EventHandler Jump = delegate { };

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