untuk memahami perbedaannya Anda dapat melihat 2 contoh ini
Contoh dengan Delegasi (Tindakan dalam hal ini adalah jenis delegasi yang tidak mengembalikan nilai)
public class Animal
{
public Action Run {get; set;}
public void RaiseEvent()
{
if (Run != null)
{
Run();
}
}
}
untuk menggunakan delegasi, Anda harus melakukan sesuatu seperti ini
Animale animal= new Animal();
animal.Run += () => Console.WriteLine("I'm running");
animal.Run += () => Console.WriteLine("I'm still running") ;
animal.RaiseEvent();
kode ini berfungsi dengan baik tetapi Anda mungkin memiliki beberapa titik lemah.
Misalnya jika saya menulis ini
animal.Run += () => Console.WriteLine("I'm running");
animal.Run += () => Console.WriteLine("I'm still running");
animal.Run = () => Console.WriteLine("I'm sleeping") ;
dengan baris kode terakhir yang saya timpa perilaku sebelumnya hanya dengan satu yang hilang +
(saya gunakan +
sebagai gantinya +=
)
Titik lemah lainnya adalah bahwa setiap kelas yang menggunakan Animal
kelas Anda dapat menaikkan RaiseEvent
panggilannya saja animal.RaiseEvent()
.
Untuk menghindari titik lemah ini Anda dapat menggunakan events
di c #.
Kelas Hewan Anda akan berubah dengan cara ini
public class ArgsSpecial :EventArgs
{
public ArgsSpecial (string val)
{
Operation=val;
}
public string Operation {get; set;}
}
public class Animal
{
public event EventHandler<ArgsSpecial> Run = delegate{} //empty delegate. In this way you are sure that value is always != null because no one outside of the class can change it
public void RaiseEvent()
{
Run(this, new ArgsSpecial("Run faster"));
}
}
untuk memanggil acara
Animale animal= new Animal();
animal.Run += (sender, e) => Console.WriteLine("I'm running. My value is {0}", e.Operation);
animal.RaiseEvent();
Perbedaan:
- Anda tidak menggunakan properti publik tetapi bidang publik (dengan kejadian, kompilator melindungi bidang Anda dari akses yang tidak diinginkan)
- Acara tidak bisa langsung ditugaskan. Dalam hal ini Anda tidak dapat melakukan kesalahan sebelumnya yang telah saya tunjukkan dengan menimpa perilaku.
- Tidak ada orang di luar kelas Anda yang dapat mengangkat acara.
- Peristiwa dapat dimasukkan dalam deklarasi antarmuka, sedangkan bidang tidak bisa
catatan
EventHandler dideklarasikan sebagai delegasi berikut:
public delegate void EventHandler (object sender, EventArgs e)
itu membutuhkan pengirim (tipe Object) dan argumen event. Pengirim bernilai null jika berasal dari metode statis.
Anda juga dapat menggunakan EventHAndler
contoh yang menggunakan iniEventHandler<ArgsSpecial>
lihat di sini untuk dokumentasi tentang EventHandler