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.

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.

csharp
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:

text
Struk INV-202 dicetak
Notifikasi INV-202 terkirim
Laporan INV-202 tercatat
---
Struk INV-203 dicetak
Laporan INV-203 tercatat

Bedah Kode Baris per Baris #

Mari kita telaah kode di atas:

  1. Baris 1: Tipe ProsesPesanan mendeklarasikan bentuk method yang diproses: satu parameter string, tanpa return.
  2. Baris 12: Penugasan awal membuat daftar berisi satu method, yaitu CetakStruk.
  3. Baris 13-14: Operator += menambahkan dua method, sehingga alur menampung tiga target.
  4. Baris 15: Satu pemanggilan alur("INV-202") menjalankan ketiga method berurutan sesuai urutan pendaftaran.
  5. Baris 19: Operator -= menghapus KirimNotifikasi dari daftar.
  6. 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.