Tidak semua property menyimpan data. Beberapa property hanya menerjemahkan data lain menjadi nilai turunan, misalnya total gaji yang berasal dari gaji pokok ditambah tunjangan. Menyimpan nilai turunan itu di field terpisah mengundang ketidaksinkronan: satu field berubah, field turunannya lupa diikuti. Computed property menyelesaikan masalah ini dengan menghitung nilai setiap kali dibaca, tanpa penyimpanan tersendiri.

Masalah: Data Turunan yang Bisa Saling Bertentangan #

Class Pegawai memiliki GajiPokok dan Tunjangan. Bila kita juga menyimpan totalGaji di field, maka setiap perubahan gaji pokok menuntut pembaruan field total secara manual, dan kelalaian satu baris membuat dua anggota class menampilkan angka yang berbeda. Dua sumber kebenaran untuk satu besaran adalah desain yang rapuh. Nilai turunan seharusnya tidak disimpan, melainkan dihitung dari sumbernya.

Mekanisme Property Hasil Hitung #

Computed property adalah property get-only tanpa backing field:

  • Aksesor get menghitung hasil dari anggota class lain, lalu mengembalikannya; tidak ada field yang menyimpan hasil tersebut.
  • Setiap pembacaan menjalankan perhitungan ulang, sehingga hasil selalu mengikuti nilai terbaru dari sumbernya.
  • Karena tidak ada aksesor set, penugasan ke computed property gagal dikompilasi dengan galat CS0200, sama seperti property get-only.

Bila perhitungan berat dan dibaca berkali-kali, hasil dapat di-cache di backing field; teknik itu kita bahas pada bab Backing Fields.

Contoh: TotalGaji pada Class Pegawai #

csharp
public class Pegawai
{
    public string Nama { get; set; }
    public int GajiPokok { get; set; }
    public int Tunjangan { get; set; }

    public int TotalGaji
    {
        get { return GajiPokok + Tunjangan; }
    }
}

Pegawai pegawai = new Pegawai
{
    Nama = "Rina",
    GajiPokok = 6000000,
    Tunjangan = 1500000
};

Console.WriteLine($"Nama: {pegawai.Nama}");
Console.WriteLine($"Total gaji: Rp{pegawai.TotalGaji}");

pegawai.Tunjangan = 2000000;
Console.WriteLine($"Total gaji baru: Rp{pegawai.TotalGaji}");

Output yang Dihasilkan:

text
Nama: Rina
Total gaji: Rp7500000
Total gaji baru: Rp8000000

Mari kita bedah baris demi baris:

  1. public int TotalGaji { get { return GajiPokok + Tunjangan; } }: aksesor get menghitung penjumlahan dua property sumber saat itu juga; tidak ada penyimpanan untuk hasilnya.
  2. Console.WriteLine($"Total gaji: Rp{pegawai.TotalGaji}");: pembacaan pertama menghasilkan 7500000 karena GajiPokok berisi 6000000 dan Tunjangan berisi 1500000.
  3. pegawai.Tunjangan = 2000000;: hanya property sumber yang berubah; computed property tidak perlu diperbarui karena tidak menyimpan apa pun.
  4. Console.WriteLine($"Total gaji baru: Rp{pegawai.TotalGaji}");: pembacaan kedua menghitung ulang dan menghasilkan 8000000; nilai turunan otomatis mengikuti sumbernya.
text
error CS0200: Property or indexer 'Pegawai.TotalGaji' cannot be assigned to -- it is read only