Saya tidak mengerti mengapa kita membutuhkan kata kunci "event" saat mendefinisikan event, padahal kita bisa melakukan hal yang sama tanpa menggunakan kata kunci "event", hanya dengan menggunakan delegasi.
misalnya
public delegate void CustomEventHandler(int a, string b);
public event CustomEventHandler customEvent;
customEvent += new CustomEventHandler(customEventHandler);
customEvent(1,"a"); // Raising the event
Di sini jika saya menghapus kata kunci "peristiwa" dari baris kedua, maka saya juga dapat meningkatkan acara dengan memanggil delegasi. Adakah yang bisa memberi tahu saya mengapa kata kunci acara ini diperlukan?
Jawaban:
Acara serupa lapangan dan bidang publik dari jenis delegasi terlihat serupa, tetapi sebenarnya sangat berbeda.
Acara pada dasarnya seperti properti - ini adalah sepasang metode tambah / hapus (bukan get / set properti). Ketika Anda mendeklarasikan acara seperti bidang (yaitu acara di mana Anda tidak menentukan sendiri tambahkan / hapus bit), acara publik dibuat, dan bidang dukungan pribadi. Ini memungkinkan Anda mengangkat acara secara pribadi, tetapi mengizinkan langganan publik. Dengan bidang delegasi publik, siapa pun dapat menghapus penangan acara orang lain, mengangkat acara itu sendiri, dll - ini adalah bencana enkapsulasi.
Untuk informasi lebih lanjut tentang acara (dan delegasi), baca artikel saya tentang topik ini . (Pada titik tertentu saya perlu memperbarui ini untuk C # 4, yang mengubah sedikit kejadian seperti lapangan. Intinya masih benar.)
sumber
Kata kunci acara melakukan 3 hal berbeda:
=
dan()
(penugasan dan pemanggilan) menjadi privat, sehingga hanya kelas yang memuatnya yang dapat menjalankan acara atau mengganti semua metode yang ada di dalamnya. The-=
dan+=
operator masih bisa dipanggil pada sebuah acara dari luar kelas mendefinisikan itu (mereka mendapatkan akses pengubah yang Anda tulis di samping acara).-=
dan+=
berperilaku pada acara.sumber
Jawaban lainnya baik-baik saja; Saya hanya ingin menambahkan hal lain untuk dipikirkan.
Pertanyaan Anda adalah "mengapa kita membutuhkan acara ketika kita memiliki bidang tipe delegasi?" Saya akan memperluas pertanyaan itu: mengapa Anda memerlukan metode, properti, peristiwa, konstruktor atau finalisator contoh jika Anda memiliki bidang tipe delegasi? Mengapa Anda memerlukan hal lain selain bidang yang berisi nilai dan delegasi dalam satu tipe? Kenapa tidak katakan saja
?
Anda tidak membutuhkan metode, properti, atau peristiwa. Kami memberikan hal itu kepada Anda karena metode, properti, dan pola desain acara penting dan berguna, dan layak memiliki cara yang standar, terdokumentasi, dan jelas untuk menerapkannya dalam bahasa.
sumber
Ini sebagian diperlukan karena jika Anda menghilangkan
event
kata kunci, itu merusak enkapsulasi. Jika itu hanya delegasi multicast publik, siapa pun dapat memintanya, menyetelnya ke null, atau merusaknya. Jika kelas yang dipanggilMailNotifier
ada dan memiliki peristiwa yang dipanggilMailReceived
, tidak masuk akal jika tipe lain dapat mengaktifkan peristiwa itu melalui pemanggilanmailNotifier.MailReceived()
;Di sisi lain, Anda hanya dapat mencampuri dan menjalankan peristiwa 'field like' dari jenis yang mendefinisikannya.
Jika Anda ingin merahasiakan permintaan acara Anda, tidak ada yang dapat menghentikan Anda melakukan hal seperti ini:
... tapi itu adalah keseluruhan kode hanya untuk (lebih atau kurang) melakukan apa yang sudah diberikan event field kepada kita.
sumber
Acara memiliki keunggulan berbeda dibandingkan dengan bidang delegasi. Peristiwa dapat didefinisikan dalam antarmuka berbeda dengan bidang, menambahkan abstraksi ke kode, dan bahkan yang lebih penting: Peristiwa hanya dapat dipanggil dari dalam kelas yang menentukan. Dalam kasus Anda, siapa pun dapat memanggil acara tersebut, mungkin menghancurkan kode Anda.
Lihat posting blog ini untuk informasi lebih lanjut.
sumber
delegasi adalah tipe referensi. Itu mewarisi MulticastDelegate . acara adalah Pengubah. peristiwaadalah pengubah khusus untuk delegasi. Ini memodifikasi beberapa aksesibilitas fungsi / metode, misalnya metode Panggil. Setelah diubah oleh peristiwa pengubah, instance delegasi menjadi konsep "Acara" baru. Jadi Acara hanyalah salah satu delegasi yang dimodifikasi. Anda tidak dapat secara langsung mengubah referensi atau meminta sebuah Acara di luar kelas tempat Acara itu ditentukan, tetapi Anda dapat mengubah referensi atau memanggil instance delegasi normal. Acara memberikan perlindungan tambahan, sehingga Acara memiliki lebih banyak fitur keamanan. Saat Anda berada di luar kelas tempat acara ditentukan, Anda diizinkan untuk melakukan dua jenis operasi ke acara tersebut, "+ =" dan "- =". Tetapi Anda dapat mengakses semua bidang publik, properti, metode, dll. Dari instance delegasi normal. Inilah salah satu contohnya:
sumber