Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Peristiwa adalah, seperti delegasi, mekanisme pengikatan terlambat. Bahkan, peristiwa dibangun berdasarkan dukungan bahasa untuk delegasi.
Peristiwa adalah cara bagi objek untuk menyiarkan (ke semua komponen yang tertarik dalam sistem) bahwa sesuatu terjadi. Komponen lain dapat berlangganan peristiwa, dan diberi tahu saat peristiwa dinaikkan.
Anda mungkin telah menggunakan event dalam beberapa pemrograman yang telah Anda lakukan. Banyak sistem grafis memiliki model peristiwa untuk melaporkan interaksi pengguna. Peristiwa ini akan melaporkan gerakan mouse, penekanan tombol, dan interaksi serupa. Itu adalah salah satu yang paling umum, tetapi bukan satu-satunya skenario di mana peristiwa digunakan.
Anda dapat menentukan peristiwa yang harus dijalankan untuk kelas Anda. Salah satu pertimbangan penting saat bekerja dengan peristiwa adalah bahwa mungkin tidak ada objek apa pun yang terdaftar untuk peristiwa tertentu. Anda harus menulis kode agar tidak memicu peristiwa saat tidak ada pendengar yang ditetapkan.
Berlangganan acara juga membentuk keterhubungan antara dua objek (sumber acara, dan penerima acara). Anda perlu memastikan bahwa handler peristiwa membatalkan langganan dari sumber peristiwa ketika sudah tidak tertarik pada peristiwa tersebut.
Tujuan desain untuk dukungan acara
Desain bahasa untuk peristiwa menargetkan tujuan-tujuan ini:
- Aktifkan kopling minimal antara sumber peristiwa dan sink peristiwa. Kedua komponen ini mungkin ditulis oleh organisasi yang berbeda, dan bahkan mungkin diperbarui pada jadwal yang berbeda.
- Seharusnya mudah untuk berlangganan acara, dan berhenti berlangganan dari acara yang sama.
- Sumber peristiwa harus mendukung beberapa pengguna peristiwa. Ini juga harus mendukung jika tidak ada subscriber acara yang terpasang.
Anda dapat melihat bahwa tujuan untuk acara mirip dengan tujuan untuk delegasi. Itulah sebabnya dukungan bahasa acara didasarkan pada dukungan bahasa delegasi.
Dukungan bahasa untuk acara
Sintaks untuk menentukan peristiwa, dan berlangganan atau berhenti berlangganan dari peristiwa adalah ekstensi sintaks untuk delegasi.
Anda menggunakan kata kunci event untuk menentukan peristiwa:
public event EventHandler<FileFoundArgs>? FileFound;
Jenis peristiwa (EventHandler<FileListArgs> dalam contoh ini) harus merupakan jenis delegasi. Ada konvensi yang harus Anda ikuti saat mendeklarasikan peristiwa. Biasanya, tipe delegate event memiliki pengembalian void. Deklarasi peristiwa harus berupa kata kerja, atau frasa kata kerja. Gunakan past tense saat peristiwa melaporkan sesuatu yang terjadi. Gunakan kata kerja present tense (misalnya, Closing) untuk melaporkan sesuatu yang akan terjadi. Seringkali, menggunakan present tense menunjukkan bahwa kelas Anda mendukung beberapa jenis perilaku kustomisasi. Salah satu skenario yang paling umum adalah mendukung pembatalan. Misalnya, peristiwa Closing dapat menyertakan argumen yang akan menunjukkan apakah operasi penutupan harus dilanjutkan, atau tidak. Skenario lain memungkinkan penelepon untuk memodifikasi perilaku dengan memperbarui properti argumen peristiwa. Anda dapat mengajukan peristiwa untuk menunjukkan tindakan berikutnya yang diusulkan yang akan diambil algoritma. Penanganan aktivitas mungkin mengamanatkan tindakan yang berbeda dengan memodifikasi properti argumen peristiwa.
Saat Anda ingin menaikkan acara, Anda memanggil penanganan aktivitas menggunakan sintaks pemanggilan delegasi:
FileFound?.Invoke(this, new FileFoundArgs(file));
Seperti yang dibahas di bagian tentang delegasi , operator ?. memudahkan untuk memastikan bahwa Anda tidak mencoba menaikkan acara ketika tidak ada pelanggan untuk peristiwa tersebut.
Anda berlangganan acara dengan menggunakan operator +=:
var fileLister = new FileSearcher();
int filesFound = 0;
EventHandler<FileFoundArgs> onFileFound = (sender, eventArgs) =>
{
Console.WriteLine(eventArgs.FoundFile);
filesFound++;
};
fileLister.FileFound += onFileFound;
Metode handler biasanya memiliki awalan 'Aktif' diikuti dengan nama peristiwa, seperti yang ditunjukkan pada kode sebelumnya.
Anda berhenti berlangganan menggunakan operator -=:
fileLister.FileFound -= onFileFound;
Penting bagi Anda untuk mendeklarasikan variabel lokal untuk ekspresi yang mewakili penanganan aktivitas. Itu memastikan bahwa ketika berhenti berlangganan, handler dihapus. Jika, sebagai gantinya, Anda menggunakan isi ekspresi lambda, Anda mencoba menghapus handler yang tidak pernah dilampirkan, yang tidak melakukan apa pun.
Di artikel berikutnya, Anda akan mempelajari selengkapnya tentang pola peristiwa umum, dan variasi yang berbeda pada contoh ini.