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 get tanpa parameter mengembalikan nilai property; compiler memanggilnya setiap property berada di dalam ekspresi pembacaan.
  • Aksesor set menerima nilai baru lewat kata kunci value; compiler memanggilnya setiap property menjadi sisi kiri penugasan.
  • Property yang hanya memiliki aksesor get disebut get-only property. Penugasan ke property tersebut gagal dikompilasi, bukan gagal saat runtime.

Contoh: Saldo yang Hanya Bisa Dibaca #

csharp
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:

text
Pemilik: Belum diatur
Pemilik: Siti
Saldo: Rp150000

Mari kita bedah baris demi baris:

  1. public string Pemilik { get; set; } = "Belum diatur";: property biasa dengan dua aksesor dan nilai awal; kode luar bebas membaca dan menulisnya.
  2. private int saldo;: field privat menjadi satu-satunya penyimpan saldo, dan kode luar tidak melihatnya.
  3. public int Saldo { get { return saldo; } }: property Saldo hanya memiliki aksesor get, sehingga kode luar dapat membaca saldo tetapi tidak memiliki jalur penulisan.
  4. rekening.Pemilik = "Siti";: compiler memanggil aksesor set milik Pemilik, dan value berisi "Siti".
  5. rekening.Setor(50000);: saldo berubah hanya lewat method milik class, kemudian rekening.Saldo membaca hasilnya lewat aksesor get.
text
error CS0200: Property or indexer 'RekeningBank.Saldo' cannot be assigned to -- it is read only