Setiap generic class, generic method, dan generic interface yang kita tulis sejauh ini bertumpu pada satu elemen kecil bernama type parameter. Huruf T bukan aturan bahasa, melainkan konvensi penamaan komunitas. Bab ini merapikan aturan mainnya: cara menamai type parameter, batas keberlakuannya, dan cara mendeklarasikan lebih dari satu type parameter dalam satu tipe.

Konvensi Penamaan Type Parameter #

Nama type parameter mengikuti pola umum berikut:

  • Satu huruf besar T untuk type parameter tunggal tanpa makna khusus, seperti Kotak<T>.
  • Prefiks T diikuti nama deskriptif ketika maknanya penting, seperti TKey dan TValue pada Dictionary<TKey, TValue>.
  • Nama yang lebih panjang diperbolehkan, misalnya TItem, bila membantu kejelasan.

Konvensi ini bukan keharusan compiler; Kamus<Kunci, Nilai> tetap sah secara bahasa. Namun, tim pembaca kode akan lebih cepat memahami maksud deklarasi yang mengikuti konvensi.

Lebih dari Satu Type Parameter #

Deklarasi boleh memuat beberapa type parameter yang dipisahkan koma. Class kamus stok berikut memakai TKey untuk kunci dan TValue untuk nilai, dengan constraint notnull yang mengikuti kontrak Dictionary<TKey, TValue>:

csharp
public class Kamus<TKey, TValue> where TKey : notnull
{
    private Dictionary<TKey, TValue> entri = new Dictionary<TKey, TValue>();

    public void Tambah(TKey kunci, TValue nilai)
    {
        entri[kunci] = nilai;
    }

    public TValue Cari(TKey kunci)
    {
        return entri[kunci];
    }
}

Kamus<string, int> stokBarang = new Kamus<string, int>();
stokBarang.Tambah("Kopi", 40);
stokBarang.Tambah("Gula", 25);
Console.WriteLine(stokBarang.Cari("Kopi"));

Kamus<int, string> kodePos = new Kamus<int, string>();
kodePos.Tambah(40115, "Bandung");
Console.WriteLine(kodePos.Cari(40115));

Output yang Dihasilkan:

text
40
Bandung

Mari kita bedah baris demi baris:

  1. class Kamus<TKey, TValue>: Dua type parameter dinyatakan berdampingan; urutan penulisannya menentukan urutan type argument saat instantiasi.
  2. where TKey : notnull: Kunci dijamin bukan null, sesuai kebutuhan Dictionary<TKey, TValue> yang menyimpan kunci.
  3. entri[kunci] = nilai;: Indexer Dictionary menerima TKey dan menyimpan TValue; kedua tipe mengalir tanpa cast.
  4. Kamus<string, int> stokBarang: Type argument pertama menggantikan TKey, kedua menggantikan TValue; hasil Cari bertipe int.
  5. Kamus<int, string> kodePos: Type argument yang sama dengan urutan tertukar; tipe ini berbeda dari Kamus<string, int> meski definisinya satu.

Scope Type Parameter #

Type parameter hanya berlaku di dalam deklarasi yang menamainya. Type parameter milik class dapat dipakai oleh seluruh member class, sedangkan type parameter milik method hanya hidup pada method tersebut. Bila sebuah generic method di dalam generic class menyatakan T sendiri, T milik method menutupi T milik class di dalam badan method itu.

Dengan konvensi penamaan yang konsisten, pembaca kode langsung mengetahui peran setiap type parameter tanpa membaca seluruh badan class.