Bab Delegate Dasar mendeklarasikan tipe kustom LaporanHandler hanya untuk satu kebutuhan. Dalam proyek nyata, pola “method tanpa return” dan “method dengan return” muncul berulang-ulang, dan mendeklarasikan delegate baru untuk setiap pola membuat kode membengkak. .NET menyediakan tiga tipe delegate generik siap pakai yang menutup kebutuhan itu: Action, Func, dan Predicate.

Tiga Tipe Bawaan .NET #

TipeBentukDipakai untuk
Action<T>menerima argumen, tanpa returnmencetak, mengirim notifikasi
Func<T, TResult>argumen terakhir adalah return typemenghitung, mengubah data
Predicate<T>satu argumen, return boolmenguji syarat

Ketiganya generik, sehingga tipe parameter ditulis di dalam kurung sudut. Ketiga tipe juga tersedia dalam banyak overload aritas: Action dari tanpa parameter hingga 16 parameter, dan Func dari tanpa parameter hingga 16 argumen plus satu return type. Predicate sengaja hanya satu bentuk karena syarat memang paling sering menguji satu item. Kita cukup menugaskan method group yang cocok tanpa mendeklarasikan tipe delegate baru.

Contoh Daftar Belanja #

csharp
List<string> daftarBelanja = new() { "Beras 5 kg", "Gula pasir", "Minyak goreng*" };

static void TampilkanItem(string item) => Console.WriteLine($"- {item}");
static int HitungKarakter(string item) => item.Length;
static bool PerluDibeli(string item) => item.EndsWith('*');

Action<string> tampilkan = TampilkanItem;
Func<string, int> hitungKarakter = HitungKarakter;
Predicate<string> perluDibeli = PerluDibeli;

foreach (string item in daftarBelanja)
{
    if (perluDibeli(item))
    {
        tampilkan($"{item} ({hitungKarakter(item)} karakter)");
    }
}

Output yang Dihasilkan:

text
- Minyak goreng* (14 karakter)

Bedah Kode Baris per Baris #

Mari kita telaah kode di atas:

  1. Baris 1: Tiga item belanja menjadi data uji; tanda bintang menandai item yang harus dibeli.
  2. Baris 3-5: Tiga method dengan tiga bentuk berbeda: tanpa return, dengan return int, dan dengan return bool.
  3. Baris 7-9: Compiler mengonversi setiap method group ke tipe delegate bawaan yang cocok. Tidak ada deklarasi delegate baru di seluruh kode.
  4. Baris 13: perluDibeli(item) diuji seperti pemanggilan method biasa, karena Predicate<T> memang merepresentasikan sebuah syarat.
  5. Baris 15: tampilkan mencetak baris hasil, sementara hitungKarakter menghitung panjang string di dalam interpolasi.

Perhatikan pembagian perannya: perluDibeli menjawab pertanyaan ya atau tidak, hitungKarakter mengubah data menjadi angka, dan tampilkan melakukan efek samping pencetakan. Membiasakan Action untuk efek samping, Func untuk data, dan Predicate untuk keputusan membuat alur kode belanja semacam ini mudah dibaca ulang oleh rekan tim.