Aksesor set adalah satu pintu yang dilewati setiap penugasan property. Pintu inilah tempat paling tepat untuk memeriksa nilai sebelum disimpan. Pada section Exception Handling kita sudah mengenal throw dan try/catch; bab ini menggabungkan keduanya dengan property agar data class tidak pernah berisi nilai yang melanggar aturan.
Masalah: Nilai Tidak Valid Masuk Lewat Penugasan #
Class Barang menyimpan harga yang tidak boleh negatif. Bila aksesor set menyalin value tanpa pemeriksaan, satu penugasan barang.Harga = -5000; sudah cukup membuat data tidak sah. Pemeriksaan yang diletakkan di kode pemanggil tidak dapat diandalkan, karena setiap pemanggil baru harus mengingat aturan yang sama. Validasi harus berada di dalam class, tepat di aksesor yang menerima nilai.
Mekanisme Validasi di Aksesor set #
Validasi property mengikuti tiga langkah di dalam aksesor set:
- Periksa
valueterhadap aturan class, misalnya harga tidak boleh di bawah nol. - Bila aturan dilanggar, lemparkan
ArgumentExceptiondengan pesan yang menjelaskan pelanggaran tersebut. - Bila aturan terpenuhi, salin
valueke backing field; penugasan yang ditolak tidak mengubah nilai lama sedikit pun.
Karena setiap penugasan melewati aksesor yang sama, tidak ada jalur lain yang dapat memasukkan nilai tidak valid.
Contoh: Harga yang Ditolak #
public class Barang
{
private int harga;
public string Nama { get; set; }
public int Harga
{
get { return harga; }
set
{
if (value < 0)
{
throw new ArgumentException("Harga tidak boleh negatif.");
}
harga = value;
}
}
}
Barang barang = new Barang();
barang.Nama = "Tas Ransel";
barang.Harga = 175000;
Console.WriteLine($"{barang.Nama}: Rp{barang.Harga}");
try
{
barang.Harga = -5000;
}
catch (ArgumentException e)
{
Console.WriteLine($"Penugasan ditolak: {e.Message}");
}
Console.WriteLine($"Harga tetap: Rp{barang.Harga}");Output yang Dihasilkan:
Tas Ransel: Rp175000
Penugasan ditolak: Harga tidak boleh negatif.
Harga tetap: Rp175000Mari kita bedah baris demi baris:
if (value < 0): aksesorsetmemeriksa nilai baru sebelum menyentuh field;valueadalah satu-satunya jalur masuk data.throw new ArgumentException("Harga tidak boleh negatif.");: pelanggaran aturan menghentikan penugasan, dan exception menyampaikan alasannya kepada pemanggil.harga = value;: baris ini hanya dijalankan bila pemeriksaan lolos, sehingga fieldhargaselalu berisi nilai yang sah.barang.Harga = -5000;di dalam bloktry: penugasan memicu aksesorset, aksesor melempar exception, dan blokcatchmenangkapnya untuk mencetak pesan penolakan.Console.WriteLine($"Harga tetap: Rp{barang.Harga}");: pembacaan setelah penolakan menunjukkan harga lama175000masih utuh.