it-swarm-id.com

Cara menambahkan acara ke kelas

Katakanlah saya memiliki kelas bernama Frog, sepertinya:

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


     public void OnJump()
     {
         JumpCount++;
     }

}

Saya butuh bantuan dengan 2 hal:

  1. Saya ingin membuat acara bernama Langsung dalam definisi kelas.
  2. Saya ingin membuat turunan dari kelas Frog, dan kemudian membuat metode lain yang akan dipanggil ketika Frog melompat.
37
public static
public event EventHandler Jump;
public void OnJump()
{
    EventHandler handler = Jump;
    if (null != handler) handler(this, EventArgs.Empty);
}

kemudian

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: Mengapa Anda membuat salinan lokal Jump? Selain itu, Anda dapat menyimpan tes berikutnya dengan sedikit mengubah deklarasi acara:

public event EventHandler Jump = delegate { };

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

Berikut adalah contoh cara menggunakan EventHandler normal, atau delegasi khusus. Perhatikan bahwa ?. digunakan sebagai ganti . untuk memastikan bahwa jika acara tersebut null, itu akan gagal dengan bersih (null kembali)

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

Perhatikan bahwa acara itu sendiri hanya nol jika tidak ada pelanggan, dan yang pernah dipanggil, acara tersebut aman utas. Jadi, Anda juga dapat menetapkan handler kosong default untuk memastikan acara tidak nol. Perhatikan bahwa ini secara teknis rentan terhadap orang lain yang memadamkan semua acara (menggunakan GetInvocationList), jadi gunakan dengan hati-hati.

public event EventHandler Jump = delegate { };

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