Share via


event kata kunci (C++/CLI dan C++/CX)

Kata event kunci mendeklarasikan peristiwa, yang merupakan pemberitahuan kepada pelanggan terdaftar (penanganan aktivitas) bahwa sesuatu yang menarik telah terjadi.

Semua Runtime

C++/CX mendukung mendeklarasikan anggota peristiwa atau blok peristiwa. Anggota acara dipersingkat untuk mendeklarasikan blok peristiwa. Secara default, anggota peristiwa mendeklarasikan addfungsi , , removedan raise yang dinyatakan secara eksplisit dalam blok peristiwa. Untuk mengkustomisasi fungsi dalam anggota peristiwa, deklarasikan blok peristiwa sebagai gantinya lalu ambil alih fungsi yang Anda butuhkan.

Sintaks

// event data member
modifier event delegate^ event_name;

// event block
modifier event delegate^ event_name
{
   modifier return_value add(delegate^ name);
   modifier void remove(delegate^ name);
   modifier void raise(parameters);
}

Parameter

Pengubah
Pengubah yang dapat digunakan pada deklarasi peristiwa atau metode aksesor peristiwa. Nilai yang mungkin adalah static dan virtual.

delegasi
Delegasi, yang tanda tangannya harus cocok dengan penanganan aktivitas.

event_name
Nama peristiwa.

return_value
Nilai pengembalian metode aksesor peristiwa. Agar dapat diverifikasi, jenis pengembalian harus void.

parameter
(opsional) Parameter untuk metode , raise yang cocok dengan tanda tangan parameter delegasi .

Keterangan

Peristiwa adalah hubungan antara delegasi dan penanganan aktivitas. Penanganan aktivitas adalah fungsi anggota yang merespons saat peristiwa dipicu. Ini memungkinkan klien dari kelas mana pun untuk mendaftarkan metode yang cocok dengan tanda tangan dan jenis pengembalian delegasi.

Ada dua jenis deklarasi peristiwa:

anggota data peristiwa
Pengkompilasi secara otomatis membuat penyimpanan untuk peristiwa dalam bentuk anggota jenis delegasi, dan membuat fungsi internal add, remove, dan raise anggota. Anggota data peristiwa harus dideklarasikan di dalam kelas. Jenis pengembalian jenis pengembalian delegasi harus cocok dengan jenis pengembalian penanganan aktivitas.

blok kejadian
Blok peristiwa memungkinkan Anda untuk secara eksplisit mendeklarasikan dan menyesuaikan perilaku addmetode , remove, dan raise .

Anda dapat menggunakan operator += dan operator -= untuk menambahkan dan menghapus penanganan aktivitas, atau memanggil add metode dan remove secara eksplisit.

event adalah kata kunci yang sensitif terhadap konteks. Untuk informasi selengkapnya, lihat Kata kunci peka konteks.

Windows Runtime

Keterangan

Untuk informasi selengkapnya, lihat Peristiwa (C++/CX).

Untuk menambahkan dan menghapus penanganan aktivitas, simpan EventRegistrationToken struktur yang dikembalikan oleh add operasi. Kemudian dalam remove operasi, gunakan struktur yang disimpan EventRegistrationToken untuk mengidentifikasi penanganan aktivitas untuk dihapus.

Persyaratan

Opsi pengkompilasi: /ZW

Runtime Bahasa Umum

Kata kunci peristiwa memungkinkan Anda mendeklarasikan peristiwa. Peristiwa adalah cara bagi kelas untuk memberikan pemberitahuan ketika sesuatu yang menarik terjadi.

Sintaks

// event data member
modifier event delegate^ event_name;

// event block
modifier event delegate^ event_name
{
   modifier return_value add(delegate^ name);
   modifier void remove(delegate^ name);
   modifier void raise(parameters);
}

Parameter

Pengubah
Pengubah yang dapat digunakan pada deklarasi peristiwa atau metode aksesor peristiwa. Nilai yang mungkin adalah static dan virtual.

delegasi
Delegasi, yang tanda tangannya harus cocok dengan penanganan aktivitas.

event_name
Nama peristiwa.

return_value
Nilai pengembalian metode aksesor peristiwa. Agar dapat diverifikasi, jenis pengembalian harus void.

parameter
(opsional) Parameter untuk metode , raise yang cocok dengan tanda tangan parameter delegasi .

Keterangan

Peristiwa adalah hubungan antara delegasi dan penanganan aktivitas. Penanganan aktivitas adalah fungsi anggota yang merespons saat peristiwa dipicu. Ini memungkinkan klien dari kelas mana pun untuk mendaftarkan metode yang cocok dengan tanda tangan dan mengembalikan jenis delegasi yang mendasar.

Delegasi dapat memiliki satu atau beberapa metode terkait. Metode ini dipanggil ketika kode Anda menunjukkan bahwa peristiwa telah terjadi. Kejadian dalam satu program dapat tersedia untuk program lain yang menargetkan runtime bahasa umum .NET Framework.

Ada dua jenis deklarasi acara:

anggota data peristiwa
Pengkompilasi membuat penyimpanan untuk peristiwa anggota data sebagai anggota jenis delegasi. Anggota data peristiwa harus dideklarasikan di dalam kelas. Ini juga dikenal sebagai peristiwa sepele. Lihat sampel kode untuk contoh.

blok peristiwa
Blok peristiwa memungkinkan Anda menyesuaikan perilaku addmetode , , removedan raise , dengan menerapkan addmetode , remove, dan raise . Tanda tangan addmetode , remove, dan raise harus cocok dengan tanda tangan delegasi. Peristiwa blok peristiwa bukan anggota data. Setiap penggunaan sebagai anggota data menghasilkan kesalahan kompilator.

Jenis pengembalian penanganan aktivitas harus cocok dengan jenis pengembalian delegasi.

Dalam .NET Framework, Anda dapat memperlakukan anggota data seolah-olah itu adalah metode itu sendiri (yaitu, Invoke metode delegasi yang sesuai). Untuk melakukannya, tetapkan jenis delegasi untuk mendeklarasikan anggota data peristiwa terkelola. Sebaliknya, metode peristiwa terkelola secara implisit menentukan delegasi terkelola yang sesuai jika belum ditentukan. Lihat sampel kode di akhir artikel ini misalnya.

Saat mendeklarasikan peristiwa terkelola, Anda dapat menentukan add dan remove aksesor yang akan dipanggil saat penanganan aktivitas ditambahkan atau dihapus menggunakan operator += dan -=. Metode add, remove, dan raise dapat dipanggil secara eksplisit.

Langkah-langkah berikut harus diambil untuk membuat dan menggunakan peristiwa di Microsoft C++:

  1. Membuat atau mengidentifikasi delegasi. Jika Anda mendefinisikan peristiwa Anda sendiri, Anda juga harus memastikan bahwa ada delegasi untuk digunakan dengan event kata kunci. Jika peristiwa telah ditentukan sebelumnya, dalam .NET Framework misalnya, maka konsumen peristiwa hanya perlu mengetahui nama delegasi.

  2. Buat kelas yang berisi:

    • Peristiwa yang dibuat dari delegasi.

    • (Opsional) Metode yang memverifikasi bahwa instans delegasi yang dideklarasikan dengan event kata kunci ada. Jika tidak, logika ini harus ditempatkan dalam kode yang mengaktifkan peristiwa.

    • Metode yang memanggil peristiwa. Metode ini dapat menjadi penimpaan beberapa fungsionalitas kelas dasar.

    Kelas ini mendefinisikan peristiwa.

  3. Tentukan satu atau beberapa kelas yang menghubungkan metode ke peristiwa. Masing-masing kelas ini akan mengaitkan satu atau beberapa metode dengan peristiwa di kelas dasar.

  4. Gunakan peristiwa:

    • Buat objek kelas yang berisi deklarasi peristiwa.

    • Buat objek kelas yang berisi definisi peristiwa.

Untuk informasi selengkapnya tentang peristiwa C++/CLI, lihat Peristiwa di Antarmuka.

Persyaratan

Opsi pengkompilasi: /clr

Contoh

Contoh kode berikut menunjukkan pasangan deklarasikan delegasi, peristiwa, dan penanganan aktivitas. Ini menunjukkan cara berlangganan (menambahkan), memanggil, lalu berhenti berlangganan (menghapus) penanganan aktivitas.

// mcppv2_events.cpp
// compile with: /clr
using namespace System;

// declare delegates
delegate void ClickEventHandler(int, double);
delegate void DblClickEventHandler(String^);

// class that defines events
ref class EventSource {
public:
   event ClickEventHandler^ OnClick;   // declare the event OnClick
   event DblClickEventHandler^ OnDblClick;   // declare OnDblClick

   void FireEvents() {
      // raises events
      OnClick(7, 3.14159);
      OnDblClick("Hello");
   }
};

// class that defines methods that will called when event occurs
ref class EventReceiver {
public:
   void OnMyClick(int i, double d) {
      Console::WriteLine("OnClick: {0}, {1}", i, d);
   }

   void OnMyDblClick(String^ str) {
      Console::WriteLine("OnDblClick: {0}", str);
   }
};

int main() {
   EventSource ^ MyEventSource = gcnew EventSource();
   EventReceiver^ MyEventReceiver = gcnew EventReceiver();

   // hook handler to event
   MyEventSource->OnClick += gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
   MyEventSource->OnDblClick += gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);

   // invoke events
   MyEventSource->FireEvents();

   // unhook handler to event
   MyEventSource->OnClick -= gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
   MyEventSource->OnDblClick -= gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);
}
OnClick: 7, 3.14159

OnDblClick: Hello

Contoh kode berikut menunjukkan logika yang digunakan untuk menghasilkan raise metode peristiwa sepele. Jika peristiwa memiliki satu atau beberapa pelanggan, memanggil raise metode secara implisit atau eksplisit memanggil delegasi. Jika jenis pengembalian delegasi tidak void dan jika tidak ada pelanggan peristiwa, raise metode mengembalikan nilai default untuk jenis delegasi. Jika tidak ada pelanggan peristiwa, memanggil raise metode segera kembali dan tidak ada pengecualian yang dinaikkan. Jika jenis pengembalian delegasi bukan void, jenis delegasi dikembalikan.

// trivial_events.cpp
// compile with: /clr /c
using namespace System;
public delegate int Del();
public ref struct C {
   int i;
   event Del^ MyEvent;

   void FireEvent() {
      i = MyEvent();
   }
};

ref struct EventReceiver {
   int OnMyClick() { return 0; }
};

int main() {
   C c;
   c.i = 687;

   c.FireEvent();
   Console::WriteLine(c.i);
   c.i = 688;

   EventReceiver^ MyEventReceiver = gcnew EventReceiver();
   c.MyEvent += gcnew Del(MyEventReceiver, &EventReceiver::OnMyClick);
   Console::WriteLine(c.i);
}
0

688

Baca juga

Ekstensi komponen untuk .NET dan UWP