Dalam bukunya yang luar biasa, CLR Via C #, Jeffrey Richter mengatakan bahwa dia tidak menyukai properti, dan merekomendasikan untuk tidak menggunakannya. Dia memberi beberapa alasan, tapi saya tidak begitu mengerti. Adakah yang bisa menjelaskan kepada saya mengapa saya harus atau tidak boleh menggunakan properti? Di C # 3.0, dengan properti otomatis, apakah ini berubah?
Sebagai referensi, saya menambahkan pendapat Jeffrey Richter:
• Properti mungkin hanya baca atau tulis; akses lapangan selalu dapat dibaca dan ditulis. Jika Anda mendefinisikan properti, yang terbaik adalah menawarkan get dan set accessor method.
• Sebuah metode properti mungkin membuat pengecualian; akses lapangan tidak pernah membuat pengecualian.
• Properti tidak bisa dikirimkan sebagai parameter out atau ref ke metode; sebuah lapangan bisa. Misalnya, kode berikut tidak akan dikompilasi:
using System;
public sealed class SomeType
{
private static String Name
{
get { return null; }
set {}
}
static void MethodWithOutParam(out String n) { n = null; }
public static void Main()
{
// For the line of code below, the C# compiler emits the following:
// error CS0206: A property or indexer may not
// be passed as an out or ref parameter
MethodWithOutParam(out Name);
}
}
• Metode properti membutuhkan waktu lama untuk dieksekusi; akses lapangan selalu selesai dengan segera. Alasan umum untuk menggunakan properti adalah untuk melakukan sinkronisasi utas, yang dapat menghentikan utas selamanya, dan oleh karena itu, properti tidak boleh digunakan jika sinkronisasi utas diperlukan. Dalam situasi itu, metode lebih disukai. Selain itu, jika kelas Anda dapat diakses dari jarak jauh (misalnya, kelas Anda diturunkan dari System.MashalByRefObject), memanggil metode properti akan sangat lambat, dan oleh karena itu, metode lebih disukai daripada properti. Menurut pendapat saya, kelas yang diturunkan dari MarshalByRefObject tidak boleh menggunakan properti.
• Jika dipanggil beberapa kali berturut-turut, metode properti dapat mengembalikan nilai yang berbeda setiap kali; sebuah bidang mengembalikan nilai yang sama setiap kali. Kelas System.DateTime memiliki properti Sekarang hanya baca yang mengembalikan tanggal dan waktu saat ini. Setiap kali Anda menanyakan properti ini, ini akan mengembalikan nilai yang berbeda. Ini adalah kesalahan, dan Microsoft berharap mereka dapat memperbaiki kelas dengan menjadikan Now sebagai metode alih-alih properti.
• Metode properti dapat menyebabkan efek samping yang dapat diamati; akses lapangan tidak pernah melakukannya. Dengan kata lain, pengguna suatu tipe harus dapat menyetel berbagai properti yang ditentukan oleh tipe dalam urutan apa pun yang dia pilih tanpa memperhatikan perilaku yang berbeda dalam tipe tersebut.
• Sebuah metode properti mungkin memerlukan memori tambahan atau mengembalikan referensi ke sesuatu yang sebenarnya bukan bagian dari status objek, jadi memodifikasi objek yang dikembalikan tidak berpengaruh pada objek asli; membuat kueri bidang selalu mengembalikan referensi ke objek yang dijamin menjadi bagian dari status objek asli. Bekerja dengan properti yang mengembalikan salinan bisa sangat membingungkan pengembang, dan karakteristik ini sering kali tidak didokumentasikan.