Petugas gudang sering perlu menukar isi dua variabel: stok gudang dengan stok toko, atau nama penerima pengiriman pertama dengan nama kedua. Versi non-generik memaksa kita menulis TukarInt, TukarString, dan overload lain untuk setiap tipe. Generic method menghapus pengulangan itu dengan menempatkan type parameter pada deklarasi method, bukan pada class, sehingga satu method melayani semua tipe yang memenuhi syaratnya.
Mendeklarasikan Generic Method #
Type parameter dinyatakan setelah nama method dan sebelum daftar parameter. Seluruh badan method kemudian memperlakukan T sebagai tipe yang utuh:
public static class UtilitasGudang
{
public static void Tukar<T>(ref T a, ref T b)
{
T sementara = a;
a = b;
b = sementara;
}
}
int stokGudang = 12;
int stokToko = 5;
UtilitasGudang.Tukar(ref stokGudang, ref stokToko);
Console.WriteLine($"Gudang: {stokGudang}, Toko: {stokToko}");Output yang Dihasilkan:
Gudang: 5, Toko: 12Mari kita bedah baris demi baris:
public static void Tukar<T>(...): Tanda<T>setelah nama method menyatakan type parameter milik method; classUtilitasGudangsendiri tidak generik.ref T a, ref T b: Kedua parameter bertipeTdan dilewatkan denganref, sehingga penugasan di dalam method mengubah variabel milik pemanggil.T sementara = a;: Variabel penampung sementara dibuat dengan tipe yang sama denganT, tanpa cast maupun boxing.UtilitasGudang.Tukar(ref stokGudang, ref stokToko): Pemanggil tidak menulis tipe apa pun; compiler menyimpulkanTadalahintdari kedua argumen (mekanisme ini dibedah pada bab Generic Type Inference).
Menentukan Type Argument Secara Eksplisit #
Kita juga boleh menuliskan type argument secara langsung pada pemanggilan. Bentuk ini berguna ketika kita ingin menegaskan tipe yang dipilih:
string namaPertama = "Budi";
string namaKedua = "Siti";
UtilitasGudang.Tukar<string>(ref namaPertama, ref namaKedua);
Console.WriteLine($"Pertama: {namaPertama}, Kedua: {namaKedua}");Output yang Dihasilkan:
Pertama: Siti, Kedua: BudiPada panggilan kedua ini, compiler memeriksa kecocokan namaPertama dan namaKedua dengan type argument <string> yang kita tulis. Jika kedua argumen bertipe berbeda, compiler menolak pemanggilan tersebut sejak saat kompilasi. Bentuk eksplisit juga membantu pembaca kode: maksud method langsung terlihat tanpa perlu menelusuri tipe argumennya.
Satu method Tukar<T> kini menggantikan seluruh overload per tipe, dan setiap pemanggilan tetap diperiksa tipe oleh compiler.