Pada section Pemrograman Berorientasi Objek, kita menyembunyikan field di dalam class dan membuka aksesnya lewat method. C# menyediakan cara yang lebih ringkas untuk keperluan yang sama: property. Property terbaca seperti field biasa pada sisi pemanggil, tetapi setiap pembacaan dan penulisan dijalankan sebagai kode di dalam class. Bab ini menjadi pintu masuk bagi seluruh varian property yang kita bahas pada section Properties dan Encapsulation.
Masalah: Field Publik Tanpa Kendali #
Bayangkan class Produk dengan field publik harga. Kode mana pun bebas menulis produk.harga = -10000;, dan nilai yang tidak masuk akal itu langsung tersimpan tanpa pemeriksaan. Bila aturan bisnis berubah, kita harus mencari semua baris yang menyentuh field tersebut di seluruh program. Masalah ini muncul karena field publik tidak menyediakan satu titik kontrol pun.
Mekanisme Property #
Property adalah anggota class yang mendeklarasikan sepasang aksesor di dalam kurung kurawal:
- Aksesor
getdijalankan saat property dibaca, dan aksesor tersebut wajib mengembalikan nilai dengan tipe yang sama dengan property. - Aksesor
setdijalankan saat property ditulis, dan kata kuncivaluemenampung nilai baru yang dikirim pemanggil. - Modifier akses tiap aksesor mengatur siapa yang boleh memanggilnya, misalnya
publicuntuk kode luar.
Bagi pemanggil, penulisan produk.Harga = 85000; terlihat sama dengan penugasan field. Bedanya terletak pada kode yang dieksekusi: compiler menerjemahkan penugasan tersebut menjadi pemanggilan aksesor set, dan pembacaan produk.Harga menjadi pemanggilan aksesor get.
Contoh: Property pada Class Produk #
public class Produk
{
private string nama;
private int harga;
public string Nama
{
get { return nama; }
set { nama = value; }
}
public int Harga
{
get { return harga; }
set { harga = value; }
}
}
Produk produk = new Produk();
produk.Nama = "Kopi Gayo";
produk.Harga = 85000;
Console.WriteLine($"Nama produk: {produk.Nama}");
Console.WriteLine($"Harga: Rp{produk.Harga}");Output yang Dihasilkan:
Nama produk: Kopi Gayo
Harga: Rp85000Mari kita bedah baris demi baris:
private string nama;danprivate int harga;: dua field privat menyimpan data asli, dan kode luar tidak dapat menyentuhnya langsung.public string Nama { get ... set ... }: propertyNamamembuka akses ke fieldnama; aksesorgetmengembalikan isi field, sedangkan aksesorsetmenyalinvalueke field.produk.Nama = "Kopi Gayo";: compiler memanggil aksesorsetmilikNama, dan parametervalueberisi string"Kopi Gayo".Console.WriteLine($"Nama produk: {produk.Nama}");: pembacaanproduk.Namamemanggil aksesorget, sehingga hasilnya identik dengan membaca field, tetapi kode class yang berjalan.