Bab Property Dasar menunjukkan bahwa property yang sekadar membungkus field memaksa kita menulis field dan dua aksesor secara manual. Padahal banyak data class tidak butuh logika tambahan sama sekali. Untuk kasus tersebut, C# menyediakan auto-implemented property: satu baris deklarasi yang membuat aksesor dan penyimpanannya sekaligus. Bab ini membahas sintaksnya, perilaku backing field yang dihasilkan compiler, dan pemakaian nilainya bersama object initializer.
Masalah: Penulisan Field dan Aksesor yang Berulang #
Class domain seperti Pesanan bisa memiliki sepuluh data atau lebih. Bila setiap data menuntut satu field privat plus satu property dua aksesor, kita menulis struktur yang sama berulang-ulang tanpa nilai tambah. Boilerplate semacam ini juga melebar: setiap data baru mengharuskan kita menyentuh dua anggota class, padahal keduanya selalu berpasangan dengan bentuk yang sama.
Mekanisme Auto-Property #
Auto-implemented property ditulis dengan aksesor kosong:
- Sintaks
{ get; set; }memerintahkan compiler membuat backing field secara otomatis beserta dua aksesor yang membaca dan menulisnya. - Nama backing field ditentukan compiler dan tidak dapat dirujuk dari kode kita; satu-satunya jalur akses adalah property itu sendiri.
- Nilai awal dapat diberikan langsung pada deklarasi, misalnya
{ get; set; } = "Belum diatur";. - Auto-property tetap mendukung kombinasi aksesor seperti get-only (
{ get; }) yang akan kita bahas di bab-bab berikutnya.
Karena penyimpanan disiapkan compiler, penambahan logika di tengah jalan menuntut kita mengubah auto-property menjadi property biasa dengan field manual, seperti pada bab Backing Fields.
Contoh: Class Pesanan #
public class Pesanan
{
public string Nomor { get; set; }
public int Total { get; set; }
public bool Lunas { get; set; }
}
Pesanan pesanan = new Pesanan
{
Nomor = "INV-001",
Total = 125000,
Lunas = true
};
Console.WriteLine($"Nomor: {pesanan.Nomor}");
Console.WriteLine($"Total: Rp{pesanan.Total}");
Console.WriteLine($"Lunas: {pesanan.Lunas}");
pesanan.Total = 150000;
Console.WriteLine($"Total baru: Rp{pesanan.Total}");Output yang Dihasilkan:
Nomor: INV-001
Total: Rp125000
Lunas: True
Total baru: Rp150000Mari kita bedah baris demi baris:
public string Nomor { get; set; }: satu deklarasi menghasilkan backing field tak terlihat, aksesorget, dan aksesorset; tiga anggota dalam satu baris.new Pesanan { Nomor = "INV-001", ... }: object initializer menugaskan setiap property lewat aksesorset-nya, sehingga object langsung berisi data yang lengkap.Console.WriteLine($"Lunas: {pesanan.Lunas}");: propertybooldicetak seperti data lain, dan output menampilkanTruekarenaToString()milikboolmemformat nilai tersebut.pesanan.Total = 150000;: penugasan setelah object dibuat tetap lewat aksesorset; tidak ada perbedaan sintaks antara pengisian awal dan perubahan berikutnya.