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.
Delegat adalah jenis yang secara aman merangkum sebuah metode, mirip dengan penunjuk fungsi dalam bahasa C dan C++. Tidak seperti penunjuk fungsi C, delegate berorientasi objek, aman tipe, dan aman. Contoh berikut mendeklarasikan delegasi bernama Callback
yang dapat merangkum metode yang mengambil string sebagai argumen dan mengembalikan kekosongan:
public delegate void Callback(string message);
Objek delegasi biasanya dibangun dengan memberikan nama metode yang dilampirkan oleh delegasi, atau dengan ekspresi lambda. Delegasi dapat dipanggil setelah dibuat dengan cara ini. Memanggil delegasi memanggil metode yang dilampirkan ke instans delegasi. Parameter yang diteruskan ke delegasi oleh pemanggil diteruskan ke metode . Delegasi mengembalikan nilai pengembalian, jika ada, dari metode . Contohnya:
// Create a method for a delegate.
public static void DelegateMethod(string message)
{
Console.WriteLine(message);
}
// Instantiate the delegate.
Callback handler = DelegateMethod;
// Call the delegate.
handler("Hello World");
Tipe delegasi berasal dari kelas Delegate di .NET. Jenis delegasi disegel, tidak dapat berasal, dan tidak mungkin untuk mendapatkan kelas kustom dari Delegate. Karena delegasi yang diinstansiasi adalah objek, delegasi tersebut dapat diteruskan sebagai argumen atau ditetapkan ke sebuah properti. Metode dapat menerima delegasi sebagai parameter, dan memanggil delegasi di lain waktu. Ini dikenal sebagai panggilan balik asinkron, dan merupakan metode umum untuk memberi tahu penelepon ketika proses panjang selesai. Ketika delegasi digunakan dengan cara ini, kode yang menggunakan delegasi tidak memerlukan pengetahuan tentang implementasi metode yang digunakan. Fungsionalitasnya mirip dengan antarmuka enkapulasi yang disediakan.
Penggunaan umum panggilan balik lainnya adalah menentukan metode perbandingan kustom dan meneruskan delegasi tersebut ke metode pengurutan. Ini memungkinkan kode pemanggil untuk menjadi bagian dari algoritma pengurutan. Metode contoh berikut menggunakan Del
jenis sebagai parameter:
public static void MethodWithCallback(int param1, int param2, Callback callback)
{
callback("The number is: " + (param1 + param2).ToString());
}
Anda kemudian dapat meneruskan delegasi yang dibuat dalam contoh sebelumnya ke metode tersebut:
MethodWithCallback(1, 2, handler);
Dan terima output berikut ke konsol:
The number is: 3
MethodWithCallback
tidak perlu memanggil konsol secara langsung—tidak harus dirancang dengan berfokus pada konsol. Apa yang MethodWithCallback
dilakukan adalah menyiapkan string dan meneruskan string ke metode lain. Metode yang didelegasikan dapat menggunakan sejumlah parameter.
Ketika delegasi dibuat untuk membungkus metode dari suatu instans, delegasi mereferensikan baik instans dan metode tersebut. Delegasi tidak memiliki pengetahuan tentang jenis instans selain dari metode yang dibungkusnya. Delegasi dapat merujuk ke semua jenis objek selama ada metode pada objek yang cocok dengan tanda tangan delegasi. Ketika sebuah delegran dibangun untuk menyelubungi metode statis, itu hanya mengacu pada metode tersebut. Pertimbangkan deklarasi berikut:
public class MethodClass
{
public void Method1(string message) { }
public void Method2(string message) { }
}
Seiring dengan DelegateMethod
statis yang telah ditampilkan sebelumnya, kami sekarang memiliki tiga metode yang dapat Anda bungkus dalam instance Del
.
Delegat dapat memanggil lebih dari satu metode saat dipanggil, dengan istilah multicasting. Untuk menambahkan metode tambahan ke daftar metode delegasi—daftar pemanggilan—hanya perlu menambahkan dua delegasi menggunakan operator penambahan atau operator penugasan penambahan ('+' atau '+='). Contohnya:
var obj = new MethodClass();
Callback d1 = obj.Method1;
Callback d2 = obj.Method2;
Callback d3 = DelegateMethod;
//Both types of assignment are valid.
Callback allMethodsDelegate = d1 + d2;
allMethodsDelegate += d3;
allMethodsDelegate
berisi tiga metode dalam daftar pemanggilannya—Method1
, , Method2
dan DelegateMethod
. Tiga delegasi asli, , d1
, d2
dan d3
, tetap tidak berubah. Ketika allMethodsDelegate
dipanggil, ketiga metode dipanggil secara berurutan. Jika delegasi menggunakan parameter referensi, referensi diteruskan secara berurutan ke masing-masing dari tiga metode secara bergantian, dan perubahan apa pun oleh satu metode terlihat oleh metode berikutnya. Ketika salah satu metode melemparkan pengecualian yang tidak tertangkap di dalam metode tersebut, pengecualian tersebut diteruskan ke pemanggil delegate. Tidak ada metode berikutnya dalam daftar pemanggilan yang dipanggil. Jika delegasi memiliki nilai pengembalian dan/atau parameter keluar, delegasi mengembalikan nilai pengembalian dan parameter dari metode terakhir yang dipanggil. Untuk menghapus metode dari daftar pemanggilan, gunakan operator pengurangan atau operator penugasan pengurangan (-
atau -=
). Contohnya:
//remove Method1
allMethodsDelegate -= d1;
// copy AllMethodsDelegate while removing d2
Callback oneMethodDelegate = (allMethodsDelegate - d2)!;
Karena jenis delegasi berasal dari System.Delegate
, metode dan properti yang ditentukan oleh kelas tersebut dapat dipanggil pada delegasi. Misalnya, untuk menemukan jumlah metode dalam daftar pemanggilan delegasi, Anda dapat menulis:
int invocationCount = d1.GetInvocationList().GetLength(0);
Delegasi dengan lebih dari satu metode dalam daftar pemanggilan mereka berasal dari MulticastDelegate, yang merupakan subkelas dari System.Delegate
. Kode sebelumnya berfungsi dalam kedua kasus karena kedua kelas mendukung GetInvocationList
.
Delegasi multicast digunakan secara ekstensif dalam penanganan peristiwa. Objek sumber peristiwa mengirim pemberitahuan peristiwa ke objek penerima yang terdaftar untuk menerima peristiwa tersebut. Untuk mendaftarkan peristiwa, penerima membuat metode yang dirancang untuk menangani peristiwa, lalu membuat delegasi untuk metode tersebut dan meneruskan delegasi ke sumber peristiwa. Sumber memanggil delegasi saat peristiwa terjadi. Delegasi kemudian memanggil metode penanganan peristiwa pada penerima, mengirimkan data peristiwa. Sumber peristiwa menentukan jenis delegasi untuk peristiwa tertentu. Untuk informasi selengkapnya, lihat Peristiwa.
Membandingkan delegasi dari dua jenis berbeda yang ditetapkan pada waktu kompilasi menghasilkan kesalahan kompilasi. Jika instance delegasi secara statis dari jenis System.Delegate
, maka perbandingan diizinkan, tetapi akan mengembalikan false selama runtime. Contohnya:
delegate void Callback1();
delegate void Callback2();
static void method(Callback1 d, Callback2 e, System.Delegate f)
{
// Compile-time error.
Console.WriteLine(d == e);
// OK at compile-time. False if the run-time type of f
// is not the same as that of d.
Console.WriteLine(d == f);
}