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 get dijalankan saat property dibaca, dan aksesor tersebut wajib mengembalikan nilai dengan tipe yang sama dengan property.
  • Aksesor set dijalankan saat property ditulis, dan kata kunci value menampung nilai baru yang dikirim pemanggil.
  • Modifier akses tiap aksesor mengatur siapa yang boleh memanggilnya, misalnya public untuk 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 #

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

text
Nama produk: Kopi Gayo
Harga: Rp85000

Mari kita bedah baris demi baris:

  1. private string nama; dan private int harga;: dua field privat menyimpan data asli, dan kode luar tidak dapat menyentuhnya langsung.
  2. public string Nama { get ... set ... }: property Nama membuka akses ke field nama; aksesor get mengembalikan isi field, sedangkan aksesor set menyalin value ke field.
  3. produk.Nama = "Kopi Gayo";: compiler memanggil aksesor set milik Nama, dan parameter value berisi string "Kopi Gayo".
  4. Console.WriteLine($"Nama produk: {produk.Nama}");: pembacaan produk.Nama memanggil aksesor get, sehingga hasilnya identik dengan membaca field, tetapi kode class yang berjalan.