Satu class di C# boleh ditulis terpecah ke beberapa file melalui kata kunci partial, dan kebiasaan ini dimanfaatkan oleh alat otomatis yang menulis kode saat build. Partial methods melengkapi pola tersebut: satu bagian class hanya menuliskan deklarasi method, sedangkan implementasinya boleh ditulis di bagian lain — oleh manusia maupun oleh alat. Bila implementasi tidak pernah muncul, compiler menghapus seluruh panggilannya.
Deklarasi dan Implementasi #
Sebuah partial method terdiri atas dua bagian terpisah:
- Deklarasi:
static partial void Catat(string pesan);— kontrak saja, ditandaipartialdan diakhiri titik koma. - Implementasi: signature yang sama tanpa titik koma, lengkap dengan body, ditulis di bagian class mana pun.
Kedua bagian harus berada dalam class yang sama dan sama-sama ditandai partial. Class pemiliknya pun wajib partial.
Contoh Lengkap #
partial class Pelacak
{
static partial void Catat(string pesan);
public static void Proses()
{
Catat("pesanan dibuat");
Console.WriteLine("pesanan diproses");
}
}
partial class Pelacak
{
static partial void Catat(string pesan)
{
Console.WriteLine($"[catatan] {pesan}");
}
}
Pelacak.Proses();Output yang Dihasilkan:
[catatan] pesanan dibuat
pesanan diprosesMari kita bedah:
- Baris 3: deklarasi partial method; baris ini hanya menjanjikan bahwa
Catatmungkin ada. - Baris 14-18: implementasi yang menyambung kontrak tersebut; kedua potongan class
Pelacakdigabung compiler menjadi satu class utuh. - Baris 7 (
Catat("pesanan dibuat")): panggilan di dalamProsesdiarahkan ke implementasi, sehingga pesan[catatan]ikut tercetak sebelumpesanan diproses.
Saat Implementasi Tidak Ada #
Class berikut memiliki deklarasi yang sama tanpa implementasi:
partial class PelacakTanpaImplementasi
{
static partial void Catat(string pesan);
public static void Proses()
{
Catat("pesanan dibuat");
Console.WriteLine("pesanan diproses");
}
}
PelacakTanpaImplementasi.Proses();Output yang Dihasilkan:
pesanan diprosesPanggilan Catat tidak menimbulkan galat apa pun: compiler menghapus baris tersebut beserta evaluasi argument-nya, sehingga class tanpa implementasi tidak menanggung biaya apa pun saat runtime. Di sinilah kegunaannya: bagian yang ditulis manusia menyediakan titik sambung, dan keputusan mengisi titik itu boleh ditunda.
Pola Source Generator Modern #
Pola ini kini menjadi jembatan antara kode kita dan source generator — alat yang menulis kode C# baru saat build. Contoh bentuknya pada atribut [GeneratedRegex]:
public partial class ValidasiPengguna
{
[GeneratedRegex(@"^\d{5}$")]
private static partial Regex KodePos();
}Kita tidak menjalankan generator di bab ini; yang perlu dipahami adalah pembagian perannya. Kita menulis deklarasi partial method di atas, dan saat build, generator .NET menuliskan implementasi KodePos() berupa mesin regex yang sudah jadi. Kode pemakai kemudian memanggil ValidasiPengguna.KodePos() seperti method biasa. EF Core memakai pola serupa untuk menghasilkan kode query. Perbedaan pentingnya: versi generator ini memiliki return type dan access modifier, karena implementasinya dijamin ada saat build.