Bagikan melalui


delegasi (C++/CLI dan C++/CX)

Mendeklarasikan jenis yang mewakili penunjuk fungsi.

Semua Runtime

Baik Windows Runtime maupun delegasi dukungan runtime bahasa umum.

Keterangan

delegasi adalah kata kunci yang sensitif terhadap konteks. Untuk informasi selengkapnya, lihat Kata Kunci Peka Konteks.

Untuk mendeteksi pada waktu kompilasi jika jenis adalah delegasi, gunakan __is_delegate() sifat jenis. Untuk informasi selengkapnya, lihat Dukungan Pengkompilasi untuk Jenis Sifat.

Windows Runtime

C++/CX mendukung delegasi dengan sintaks berikut.

Sintaks

access
delegate
return-type
delegate-type-identifier
(
[ parameters ]
)

Parameter

akses
(opsional) Aksesibilitas delegasi, yang dapat berupa public (default) atau private. Prototipe fungsi juga dapat memenuhi syarat dengan const kata kunci atau volatile .

jenis pengembalian
Jenis pengembalian prototipe fungsi.

pengidentifikasi jenis delegasi
Nama jenis delegasi yang dideklarasikan.

parameter
(Opsional) Jenis dan pengidentifikasi prototipe fungsi.

Keterangan

Gunakan pengidentifikasi jenis delegasi untuk mendeklarasikan peristiwa dengan prototipe yang sama dengan delegasi. Untuk informasi selengkapnya, lihat Delegasi (C++/CX).

Persyaratan

Opsi pengkompilasi: /ZW

Runtime Bahasa Umum

Runtime bahasa umum mendukung delegasi dengan sintaks berikut.

Sintaks

access
delegate
function_declaration

Parameter

akses
(opsional) Aksesibilitas delegasi di luar perakitan dapat bersifat publik atau privat. Defaultnya adalah privat. Di dalam kelas, delegasi dapat memiliki aksesibilitas apa pun.

function_declaration
Tanda tangan fungsi yang dapat terikat ke delegasi. Jenis pengembalian delegasi dapat berupa jenis terkelola apa pun. Untuk alasan interoperabilitas, disarankan agar jenis pengembalian delegasi menjadi jenis CLS.

Untuk menentukan delegasi yang tidak terikat, parameter pertama dalam function_declaration harus menjadi jenis this penunjuk untuk objek.

Keterangan

Delegasi adalah multicast: "penunjuk fungsi" dapat terikat ke satu atau beberapa metode dalam kelas terkelola. Kata kunci delegasi menentukan jenis delegasi multicast dengan tanda tangan metode tertentu.

Delegasi juga dapat terikat ke metode kelas nilai, seperti metode statis.

Delegasi memiliki karakteristik berikut:

  • Ini mewarisi dari System::MulticastDelegate.

  • Ini memiliki konstruktor yang mengambil dua argumen: penunjuk ke kelas terkelola atau NULL (dalam kasus pengikatan ke metode statis) dan metode yang sepenuhnya memenuhi syarat dari jenis yang ditentukan.

  • Ini memiliki metode yang disebut Invoke, yang tanda tangannya cocok dengan tanda tangan delegasi yang dinyatakan.

Ketika delegasi dipanggil, fungsinya dipanggil dalam urutan terpasang.

Nilai pengembalian delegasi adalah nilai pengembalian dari fungsi anggota terlampir terakhirnya.

Delegasi tidak dapat kelebihan beban.

Delegasi dapat terikat atau tidak terikat.

Saat Anda membuat instans delegasi terikat, argumen pertama akan menjadi referensi objek. Argumen kedua dari instansiasi delegasi harus berupa alamat metode objek kelas terkelola, atau penunjuk ke metode jenis nilai. Argumen kedua dari instansiasi delegasi harus memberi nama metode dengan sintaks cakupan kelas lengkap dan menerapkan alamat operator.

Saat Anda membuat instans delegasi yang tidak terikat, argumen pertama harus menjadi alamat metode objek kelas terkelola, atau penunjuk ke metode jenis nilai. Argumen harus memberi nama metode dengan sintaks cakupan kelas lengkap dan menerapkan alamat operator.

Saat membuat delegasi ke fungsi statis atau global, hanya satu parameter yang diperlukan: fungsi (secara opsional, alamat fungsi).

Untuk informasi selengkapnya tentang delegasi, lihat

Persyaratan

Opsi pengkompilasi: /clr

Contoh

Contoh berikut menunjukkan cara mendeklarasikan, menginisialisasi, dan memanggil delegasi.

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

// declare a delegate
public delegate void MyDel(int i);

ref class A {
public:
   void func1(int i) {
      Console::WriteLine("in func1 {0}", i);
   }

   void func2(int i) {
      Console::WriteLine("in func2 {0}", i);
   }

   static void func3(int i) {
      Console::WriteLine("in static func3 {0}", i);
   }
};

int main () {
   A ^ a = gcnew A;

   // declare a delegate instance
   MyDel^ DelInst;

   // test if delegate is initialized
   if (DelInst)
      DelInst(7);

   // assigning to delegate
   DelInst = gcnew MyDel(a, &A::func1);

   // invoke delegate
   if (DelInst)
      DelInst(8);

   // add a function
   DelInst += gcnew MyDel(a, &A::func2);

   DelInst(9);

   // remove a function
   DelInst -= gcnew MyDel(a, &A::func1);

   // invoke delegate with Invoke
   DelInst->Invoke(10);

   // make delegate to static function
   MyDel ^ StaticDelInst = gcnew MyDel(&A::func3);
   StaticDelInst(11);
}
in func1 8

in func1 9

in func2 9

in func2 10

in static func3 11

Lihat juga

Ekstensi Komponen untuk .NET dan UWP