it-swarm-eu.dev

Jak přidat událost do třídy

Řekněme, že mám třídu Frog, vypadá to takto:

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


     public void OnJump()
     {
         JumpCount++;
     }

}

Potřebuji pomoc se 2 věcmi:

  1. Chci vytvořit definici události s názvem Jump.
  2. Chci vytvořit instanci třídy Frog a pak vytvořit jinou metodu, která bude volána, když skočí žába.
37
public static
public event EventHandler Jump;
public void OnJump()
{
    EventHandler handler = Jump;
    if (null != handler) handler(this, EventArgs.Empty);
}

pak

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: Proč vytváříte místní kopii Jump? Následující test můžete navíc uložit mírnou změnou deklarace události:

public event EventHandler Jump = delegate { };

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

Zde je ukázka, jak použít normální EventHandler nebo vlastní delegát. Všimněte si, že ?. se používá místo . k zajištění toho, že pokud je událost null, bude selhat čistě (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);
}

Všimněte si, že událost sama o sobě je pouze null, pokud neexistují žádné odběratelé, a pokud je jednou vyvolána, událost je zabezpečena podprocesem. Můžete také přiřadit výchozí prázdný obslužný program, aby se zajistilo, že událost není null. Všimněte si, že je to technicky zranitelné pro někoho jiného, ​​kdo vyhladí všechny události (pomocí GetInvocationList), takže je používejte opatrně.

public event EventHandler Jump = delegate { };

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