Setiap property terdiri atas dua aksesor dengan peran yang berbeda: aksesor get untuk membaca dan aksesor set untuk menulis. Kedua aksesor tersebut tidak harus dipasangkan selalu. Banyak data class yang boleh dibaca siapa pun tetapi tidak boleh ditulis dari luar, misalnya saldo rekening. Bab ini membahas cara kerja kedua aksesor dan pola get-only yang memutus akses tulis sepenuhnya.
Masalah: Baca dan Tulis Butuh Aturan Berbeda #
Pada class RekeningBank, saldo boleh diperlihatkan kepada kode luar, tetapi perubahan saldo harus melewati method Setor() yang berlaku sebagai satu pintu. Bila property Saldo memakai aksesor set biasa, kode luar dapat menimpa saldo dengan rekening.Saldo = 999999; dan melewati seluruh aturan. Kita butuh property yang bisa dibaca tetapi tidak bisa ditulis.
Aksesor get dan set #
- Aksesor
gettanpa parameter mengembalikan nilai property; compiler memanggilnya setiap property berada di dalam ekspresi pembacaan. - Aksesor
setmenerima nilai baru lewat kata kuncivalue; compiler memanggilnya setiap property menjadi sisi kiri penugasan. - Property yang hanya memiliki aksesor
getdisebut get-only property. Penugasan ke property tersebut gagal dikompilasi, bukan gagal saat runtime.
Contoh: Saldo yang Hanya Bisa Dibaca #
public class RekeningBank
{
public string Pemilik { get; set; } = "Belum diatur";
private int saldo;
public int Saldo
{
get { return saldo; }
}
public RekeningBank(int saldoAwal)
{
saldo = saldoAwal;
}
public void Setor(int jumlah)
{
saldo = saldo + jumlah;
}
}
RekeningBank rekening = new RekeningBank(100000);
Console.WriteLine($"Pemilik: {rekening.Pemilik}");
rekening.Pemilik = "Siti";
rekening.Setor(50000);
Console.WriteLine($"Pemilik: {rekening.Pemilik}");
Console.WriteLine($"Saldo: Rp{rekening.Saldo}");Output yang Dihasilkan:
Pemilik: Belum diatur
Pemilik: Siti
Saldo: Rp150000Mari kita bedah baris demi baris:
public string Pemilik { get; set; } = "Belum diatur";: property biasa dengan dua aksesor dan nilai awal; kode luar bebas membaca dan menulisnya.private int saldo;: field privat menjadi satu-satunya penyimpan saldo, dan kode luar tidak melihatnya.public int Saldo { get { return saldo; } }: propertySaldohanya memiliki aksesorget, sehingga kode luar dapat membaca saldo tetapi tidak memiliki jalur penulisan.rekening.Pemilik = "Siti";: compiler memanggil aksesorsetmilikPemilik, danvalueberisi"Siti".rekening.Setor(50000);: saldo berubah hanya lewat method milik class, kemudianrekening.Saldomembaca hasilnya lewat aksesorget.
error CS0200: Property or indexer 'RekeningBank.Saldo' cannot be assigned to -- it is read only