Bagikan melalui


Pengantar peristiwa

Sebelumnya

Peristiwa adalah, seperti delegasi, mekanisme pengikatan terlambat. Bahkan, peristiwa dibangun di atas dukungan bahasa untuk delegasi.

Peristiwa adalah cara bagi suatu objek untuk menyiarkan (ke semua komponen yang tertarik dalam sistem) bahwa sesuatu telah terjadi. Komponen lain apa pun dapat berlangganan ke peristiwa tersebut, dan diberi tahu saat peristiwa dinaikkan.

Anda mungkin telah menggunakan peristiwa di beberapa pemrograman Anda. Banyak sistem grafis memiliki model peristiwa untuk melaporkan interaksi pengguna. Peristiwa ini akan melaporkan gerakan mouse, penekanan tombol dan interaksi serupa. Itu salah satu yang paling umum, tetapi tentu saja bukan satu-satunya skenario tempat peristiwa digunakan.

Anda dapat menentukan peristiwa yang harus dinaikkan untuk kelas Anda. Salah satu pertimbangan penting ketika bekerja dengan peristiwa adalah bahwa mungkin tidak ada objek yang terdaftar untuk peristiwa tertentu. Anda harus menulis kode Anda sehingga tidak meningkatkan peristiwa ketika tidak ada pendengar yang dikonfigurasi.

Berlangganan peristiwa juga membuat sambungan antara dua objek (sumber peristiwa, dan sink peristiwa). Anda perlu memastikan bahwa peristiwa sink berhenti berlangganan dari sumber acara ketika tidak lagi tertarik pada peristiwa.

Tujuan desain untuk dukungan peristiwa

Desain bahasa untuk peristiwa menargetkan tujuan ini:

  • Aktifkan sambungan yang sangat minimal antara sumber peristiwa dan sink peristiwa. Kedua komponen ini mungkin tidak ditulis oleh organisasi yang sama, dan bahkan dapat diperbarui pada jadwal yang sama sekali berbeda.

  • Seharusnya sangat mudah untuk berlangganan suatu peristiwa, dan berhenti berlangganan dari peristiwa yang sama.

  • Sumber peristiwa harus mendukung beberapa pelanggan peristiwa. Ini juga harus mendukung agar tidak ada pelanggan peristiwa yang dilampirkan.

Anda dapat melihat bahwa tujuan untuk peristiwa sangat mirip dengan tujuan untuk delegasi. Itu sebabnya dukungan bahasa peristiwa dibangun di atas dukungan bahasa delegasi.

Dukungan bahasa untuk peristiwa

Sintaks untuk mendefinisikan peristiwa, dan berlangganan atau berhenti berlangganan dari peristiwa adalah perpanjangan dari sintaks untuk delegasi.

Untuk menentukan peristiwa, gunakan kata kunci event:

public event EventHandler<FileListArgs> Progress;

Jenis peristiwa (EventHandler<FileListArgs> dalam contoh ini) harus merupakan jenis delegasi. Ada sejumlah konvensi yang harus Anda ikuti saat mendeklarasikan suatu peristiwa. Biasanya, jenis delegasi peristiwa memiliki pengembalian void. Deklarasi peristiwa harus berupa kata kerja, atau frasa kata kerja. Gunakan bentuk lampau saat peristiwa melaporkan sesuatu yang telah terjadi. Gunakan kata kerja saat ini (misalnya, Closing) untuk melaporkan sesuatu yang akan terjadi. Sering kali, menggunakan bentuk saat ini menunjukkan bahwa kelas Anda mendukung semacam 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 dapat memungkinkan pemanggil untuk mengubah perilaku dengan memperbarui properti argumen peristiwa. Anda dapat menaikkan peristiwa untuk menunjukkan tindakan berikutnya yang diusulkan yang akan diambil oleh algoritma. Penanganan aktivitas dapat mengamanatkan tindakan yang berbeda dengan memodifikasi properti argumen peristiwa.

Saat Anda ingin menaikkan acara, Anda memanggil penanganan aktivitas menggunakan sintaks pemanggilan delegasi:

Progress?.Invoke(this, new FileListArgs(file));

Seperti yang dibahas di bagian tentang delegasi, ?. operator mempermudah untuk memastikan bahwa Anda tidak mencoba untuk meningkatkan peristiwa ketika tidak ada pelanggan untuk peristiwa itu.

Anda berlangganan peristiwa dengan menggunakan operator +=:

EventHandler<FileListArgs> onProgress = (sender, eventArgs) =>
    Console.WriteLine(eventArgs.FoundFile);

fileLister.Progress += onProgress;

Metode penanganan biasanya memiliki prefiks 'On' diikuti dengan nama peristiwa, seperti yang ditunjukkan di atas.

Anda berhenti berlangganan menggunakan operator -=:

fileLister.Progress -= onProgress;

Penting bagi Anda untuk mendeklarasikan variabel lokal untuk ekspresi yang mewakili penanganan aktivitas. Itu memastikan berhenti berlangganan akan menghapus yag menangani. Jika, sebaliknya, Anda menggunakan badan ekspresi lambda, Anda mencoba menghapus yang menangani yang belum pernah terpasang, yang tidak melakukan apa-apa.

Pada artikel berikutnya, Anda akan mempelajari lebih lanjut tentang pola peristiwa yang khas, dan variasi lain pada contoh ini.

Berikutnya