Field dan property pada C#

Field sebetulnya merupakan variabel sederhana yang dideklarasikan di dalam class. Dalam OOP, meskipun field lebih mudah dibuat daripada properties, banyak orang lebih menyarankan penggunaan properties daripada fields. Kelebihan menggunakan properties antara lain:

  • Dapat menyembunyikan atau menjaga implementasi kode. Sebagai contoh, kita dapat  menolak memasukkan suatu nilai ke dalam suatu properties apabila nilai tersebut tidak memenuhi kondisi tertentu.
  • Kita dapat mencatat akses pembacaan atau perubahan properties dengan cara menambahkan kode pelacak ke dalam method getter dan setter.
  • Dapat diakses dengan reflection (tidak akan dibahas di sini).
  • Dapat digunakan untuk data binding.

Field pada C#:

public int Jumlah;

Properties pada C#:

private int jumlah;
public int Jumlah {
  get {
    return jumlah;
  }
  set {
    jumlah = value;
  }
}

Pada mulanya, suatu property adalah gabungan sebuah field private, sebuah method getter dan sebuah method setter. Akan tetapi pada C#, property dikemas menjadi satu dengan getter dan setternya. Di bawah ini adalah syntax deklarasi property pada C# yang bahkan lebih singkat lagi:

public int Jumlah { get; set; }

Pada suatu property, jika suatu setter tidak buat, maka property tersebut menjadi property readonly. Dan apabila getternya dihilangkan, property tersebut akan menjadi property writeonly. Di bawah ini adalah contoh-contoh properties pada C#:

  public class Siswa {
    public string Nama { get; set; }
    public DateTime TglLahir { get; private set; }
    //Umur (tahun) dihitung otomatis berdasarkan TglLahir
    public int Umur {
      get {
        //Umur dalam tipe data TimeSpan
        TimeSpan ts = DateTime.Now - TglLahir;
        //Konversi balik ke DateTime agar mudah
        DateTime umur = DateTime.MinValue + ts;
        //Karena DateTime.MinValue bernilai 0001-01-01,
        //Kurangkan 1 dari tahun umur.
        return umur.Year - 1;
      }
    }

    private double kuis, uts, uas;
    public double Kuis {
      get { return kuis; }
      set {
        if (value < 0 || value > 100) Console.WriteLine("Nilai tidak valid");
        kuis = value;
      }
    }
    public double Uts {
      get { return uts; }
      set {
        if (value < 0 || value > 100) Console.WriteLine("Nilai tidak valid");
        uts = value;
      }
    }
    public double Uas {
      get { return uas; }
      set {
        if (value < 0 || value > 100) Console.WriteLine("Nilai tidak valid");
        uas = value;
      }
    }
  }

Pada contoh di atas, Nama adalah suatu property sederhana TglLahir adalah suatu property readonly. Umur adalah suatu property readonly dengan nilai yang dihitung, properties sisanya: Kuis, Uts dan Uas adalah properties sederhana dengan sedikit batasan nilai.

Ingat bahwa identifier pada C# bersifat case sensitive. Identifier uas berbeda dari identifier Uas. Ada sistem penamaan pada C# yang menggunakan huruf kecil untuk field private (kuis, uts, uas) dan huruf besar di awal untuk nama property seperti di atas (Kuis, Uts, Uas). Ada juga yang menggunakan underscore di depan field yang private misalnya _kuis, _uts, _uas. Ini hanya masalah penamaan sederhana, akan tetapi kita sebaiknya konsisten dalam menggunakan sistem penamaan ini, karena hal ini akan sangat membantu dalam mengelola kode program kita.

Properties static pada C#

Pada bagian sebelumnya, kita telah memahas mengenai method static. Property static mirip dengan method static. Property static dapat diakses tanpa meng-initialize suatu class. Property static dapat dianggap sebagai properties yang mencakup satu class. Property static diakses dan diubah langsung dari nama class. Sebagai contoh, kita tambahkan constructor dan property static berikut ke class Siswa:

    public Siswa(string nama, DateTime tgllahir) {
      Jumlah += 1;
      this.Nama = nama;
      this.TglLahir = tgllahir;
      this.kuis = 0;
      this.uts = 0;
      this.uas = 0;
    }

    public static int Jumlah { get; set; }

Di bawah ini adalah contoh cara menggunakan properties static:

  class Program {
    static void Main(string[] args) {
      Siswa.Jumlah = 0;
      Siswa Jane = new Siswa("Jane", new DateTime(1990, 5, 20));
      Siswa Steven = new Siswa("Steven", new DateTime(1989, 3, 2));
      Console.WriteLine(Siswa.Jumlah); //Menampilkan 2

      Console.ReadKey();
    }
  }

Pada contoh di atas Property static Jumlah tidak dapat diakses melalui Jane.Jumlah ataupun Steven.Jumlah. Melainkan harus diakses langsung dari Siswa.Jumlah, di mana Siswa adalah Class, bukan Object. Hal ini hanya dapat dilakukan pada properties static.

Di bawah baris Siswa.Jumlah = 0, dibuat dua buah objek Siswa, yaitu Jane dan Steven. Kedua objek tersebut dibuat dengan fungsi new Siswa, yaitu fungsi constructor yang didefinisikan pada blok program public Siswa. Di dalam constructor tersebut, ada perintah Jumlah += 1, yang akan menambahkan 1 ke property static Jumlah. Sehingga setelah dua objek dibuat, maka Siswa.Jumlah akan bernilai 2.