Penyelesaian pesanan biasanya memicu lebih dari satu aksi: struk dicetak, notifikasi dikirim, laporan harian diperbarui. Menulis ketiga pemanggilan itu di satu method mengikat urutan aksi ke kode pemanggil. Multicast delegate menampung daftar method di dalam satu variabel delegate, dan satu pemanggilan menjalankan seluruh daftar secara berurutan.
Menumpuk dan Melepas Method #
Setiap instance delegate sebenarnya membungkus sebuah daftar pemanggilan (invocation list). Operator += menambahkan method ke daftar, sedangkan operator -= menghapusnya. Pemanggilan menjalankan method dalam urutan pendaftaran; apabila salah satu method melempar exception, method di belakangnya tidak dieksekusi.
Mekanisme ini menjadi fondasi event yang akan kita bahas segera: event pada dasarnya adalah delegate multicast dengan aturan akses yang lebih ketat. Untuk inspeksi, method GetInvocationList() mengembalikan seluruh isi daftar sebagai array Delegate, berguna ketika kita perlu memeriksa jumlah dan urutan handler.
delegate void ProsesPesanan(string nomor);
static void CetakStruk(string nomor) =>
Console.WriteLine($"Struk {nomor} dicetak");
static void KirimNotifikasi(string nomor) =>
Console.WriteLine($"Notifikasi {nomor} terkirim");
static void CatatLaporan(string nomor) =>
Console.WriteLine($"Laporan {nomor} tercatat");
ProsesPesanan alur = CetakStruk;
alur += KirimNotifikasi;
alur += CatatLaporan;
alur("INV-202");
Console.WriteLine("---");
alur -= KirimNotifikasi;
alur("INV-203");Output yang Dihasilkan:
Struk INV-202 dicetak
Notifikasi INV-202 terkirim
Laporan INV-202 tercatat
---
Struk INV-203 dicetak
Laporan INV-203 tercatatBedah Kode Baris per Baris #
Mari kita telaah kode di atas:
- Baris 1: Tipe
ProsesPesananmendeklarasikan bentuk method yang diproses: satu parameterstring, tanpa return. - Baris 12: Penugasan awal membuat daftar berisi satu method, yaitu
CetakStruk. - Baris 13-14: Operator
+=menambahkan dua method, sehinggaalurmenampung tiga target. - Baris 15: Satu pemanggilan
alur("INV-202")menjalankan ketiga method berurutan sesuai urutan pendaftaran. - Baris 19: Operator
-=menghapusKirimNotifikasidari daftar. - Baris 20: Pemanggilan berikutnya hanya menjalankan dua method tersisa, terbukti dari baris output setelah tanda pemisah.
Satu catatan urutan: eksekusi mengikuti urutan pendaftaran, bukan urutan deklarasi method. Apabila urutan aksi kritikal, misalnya kuitansi harus tercetak sebelum notifikasi dikirim, daftarkan handler pada satu titik tunggu yang jelas agar pembaca kode tidak perlu menebak dari tempat deklarasi.