Kita sering menginginkan method tambahan pada tipe bawaan, misalnya KapitalAwal untuk string — tetapi source code string tidak bisa kita ubah. Extension methods menjawab kebutuhan ini: sebuah static method dengan modifier this pada parameter pertamanya dapat dipanggil seolah-olah method itu menempel pada tipe tersebut, tanpa mengubah tipe aslinya sedikit pun.

Tiga Syarat Extension Method #

  1. Method harus static dan berada di dalam static class.
  2. Parameter pertama diberi modifier this, dan tipenya adalah tipe yang ingin diperluas.
  3. Namespace tempat extension method berada harus terlihat oleh pemanggil; bila berbeda namespace, tambahkan using seperti biasa.

Contoh Lengkap #

csharp
static class StringExtensions
{
    public static string KapitalAwal(this string teks)
    {
        if (string.IsNullOrEmpty(teks))
        {
            return teks;
        }
        return char.ToUpperInvariant(teks[0]) + teks.Substring(1);
    }
}

static class AngkaExtensions
{
    public static bool ApakahGenap(this int angka)
    {
        return angka % 2 == 0;
    }
}

string nama = "budi santoso";
Console.WriteLine(nama.KapitalAwal());
Console.WriteLine("surabaya".KapitalAwal());
Console.WriteLine(8.ApakahGenap());
Console.WriteLine(7.ApakahGenap());

Output yang Dihasilkan:

text
Budi santoso
Surabaya
True
False

Mari kita bedah baris demi baris:

  1. Baris 3 (this string teks): modifier this pada parameter pertama menandai string sebagai tipe yang diperluas; method KapitalAwal kini bisa dipanggil pada nilai string apa pun.
  2. Baris 5-8: isi method menanggapi string kosong dengan mengembalikan apa adanya, sehingga pemanggil tidak perlu pemeriksaan tambahan.
  3. Baris 9: huruf pertama dijadikan kapital lalu digabung dengan sisa teks; char.ToUpperInvariant dipakai agar hasil tidak terpengaruh pengaturan regional.
  4. Baris 22 (nama.KapitalAwal()): compiler menerjemahkan panggilan ini menjadi StringExtensions.KapitalAwal(nama). Kita menulis panggilan gaya instance, sedangkan yang berjalan tetap static method dengan argument nama.
  5. Baris 24-25: pola yang sama berlaku untuk int; 8.ApakahGenap() berarti AngkaExtensions.ApakahGenap(8) dan menghasilkan True.

Nilai literal pun boleh menjadi pemanggil, seperti "surabaya".KapitalAwal() pada baris 23 — bukti bahwa extension method hanya cara pandang pada baris pemanggilan.

Bila extension method mengembalikan tipe yang sama dengan parameternya, panggilan dapat dirantai: hasil KapitalAwal() bertipe string sehingga boleh langsung dipanggil method string lain setelahnya. Pola rantai inilah yang membuat method koleksi LINQ nyaman dipakai.

Extension method tidak bisa mengakses bagian privat tipe yang diperluas; method ini hanya melihat permukaan publik, sama seperti method biasa dari luar.