Saya akan mengambil langkah lebih jauh, dan membawanya ke 3 kasing. Meskipun ada variasi pada masing-masing, ini adalah aturan yang saya gunakan sebagian besar waktu ketika pemrograman C #.
Dalam kasus 2 & 3, selalu buka Accessor Properti (bukan variabel bidang). Dan dalam kasus 1, Anda diselamatkan bahkan dari harus membuat pilihan ini.
1.) Properti tidak berubah (diteruskan ke konstruktor, atau dibuat pada waktu konstruksi). Dalam hal ini, saya menggunakan variabel bidang, dengan properti hanya-baca. Saya memilih ini daripada setter pribadi, karena setter pribadi tidak menjamin keabadian.
public class Abc
{
private readonly int foo;
public Abc(int fooToUse){
foo = fooToUse;
}
public int Foo { get{ return foo; } }
}
2.) variabel POCO. Variabel sederhana yang dapat / diatur pada ruang publik / pribadi. Dalam hal ini saya hanya akan menggunakan properti otomatis.
public class Abc
{
public int Foo {get; set;}
}
3.) ViewModel mengikat properti. Untuk kelas yang mendukung INotifyPropertyChanged, saya pikir Anda memerlukan variabel bidang pribadi, dukungan.
public class Abc : INotifyPropertyChanged
{
private int foo;
public int Foo
{
get { return foo; }
set { foo = value; OnPropertyChanged("foo"); }
}
}
public int Foo {get; set;}
bukanpublic int Foo
?Secara umum, saya akan mengatakan menetapkan ke bidang di konstruktor dan menggunakan properti di tempat lain. Dengan cara ini, jika seseorang menambahkan fungsionalitas ke properti, Anda tidak akan melewatkannya di mana pun.
Ini jelas bukan faktor kinerja. Pengoptimal akan memberikan garis sederhana atau set untuk Anda dan kode MSIL akhir mungkin akan sama.
sumber
Tergantung.
Pertama, Anda harus memilih properti otomatis bila memungkinkan:
Kedua, pendekatan yang lebih baik mungkin adalah dengan menggunakan properti, jika Anda memiliki logika di sana, Anda mungkin harus melewatinya sendiri, terutama jika logika itu adalah sinkronisasi ulir.
Tetapi Anda juga harus mempertimbangkan bahwa itu mungkin menghambat kinerja Anda (sedikit), jika Anda menyinkronkan dengan salah, Anda bisa menemui jalan buntu, dan kadang-kadang jalan yang benar adalah berkeliling logika di properti.
sumber
public string MyValue {get; private set;}
.Yah, pendekatan langsung ke titik adalah dengan hanya menugaskannya ke variabel itu sendiri, karena Anda berada di dalam metode kelas dan Anda mengendalikan perilaku kelas.
Tetapi inti dari properti adalah bahwa mereka memisahkan variabel dari variabel abstrak. Sedangkan properti sederhana seperti dalam contoh Anda sama sekali tidak digunakan hanya atas variabel anggota publik sederhana, properti biasanya melakukan (atau seharusnya melakukan) hal-hal tambahan di dalam pengambil dan setter mereka. Dan jika Anda ingin hal-hal ini dilakukan secara otomatis ketika mengubah properti di dalam kelas, maka tentu saja lebih baik untuk bekerja di properti alih-alih variabel untuk tidak harus mengubah setiap tugas variabel ketika perilaku pengaturan properti berubah.
Anda hanya perlu memikirkannya secara konseptual. Properti sebenarnya adalah pegangan untuk mengakses beberapa keadaan internal objek, yang dapat terdiri dari lebih dari satu variabel anggota. Jadi, Anda harus bertanya pada diri sendiri apakah Anda ingin mengubah keadaan internal yang mendasarinya saja (atau hanya sebagian saja) atau properti abstrak yang mewakili keadaan ini secara keseluruhan, dan sering kali memang yang terakhir karena Anda biasanya ingin objek Anda selalu memiliki keadaan yang konsisten.
sumber
Jika ada kemungkinan bahwa properti tersebut mendapatkan / mengatur implementasi akan berubah kadang-kadang nanti (misalnya, Anda ingin meningkatkan suatu peristiwa saat memanggil
set
, atau Anda akan menambahkan beberapa mekanisme evaluasi malas kemudian keget
fungsi Anda ), maka itu mungkin ide yang bagus bahwa kode Anda di dalam kelas akan menggunakan properti di hampir semua kasus kecuali untuk - kasus yang paling mungkin jarang terjadi - di mana Anda secara eksplisit tidak ingin acara atau mekanisme evaluasi malas digunakan.Bagaimanapun, apa pun yang akan Anda lakukan, ada peluang bagus bahwa ketika Anda mengubah implementasi properti nanti sedemikian rupa, Anda harus melihat semua tempat di dalam kelas Anda mengakses properti itu untuk memeriksa apakah benar-benar properti itu akan diakses atau variabel pribadi harus digunakan.
sumber
Saya selalu menggunakan properti publik.
Seringkali beberapa logika yang harus selalu berjalan ketika properti diatur ditambahkan ke
set
metode properti, dan pengaturan bidang pribadi sebagai gantinya setter publik akan memotong logika apa pun di sana.Anda memiliki komentar tentang MVVM yang mengarah ke pertanyaan ini, dan saya merasa ini bahkan lebih penting ketika bekerja dengan MVVM. Banyak objek yang meningkatkan
PropertyChange
notifikasi setter, dan objek lain dapat berlangganan acara ini untuk melakukan beberapa tindakan ketika properti tertentu berubah. Jika Anda mengatur variabel pribadi, tindakan ini tidak akan pernah dijalankan kecuali jika Anda juga meningkatkanPropertyChanged
acara secara manual .sumber
Secara umum, terserah Anda apa yang harus Anda lakukan dengan properti dan bidang dukungannya saat mendapatkan / pengaturan.
Paling sering, hanya agar konsisten di seluruh kode, Anda harus menggunakan pengakses publik di mana pun mereka tersedia dan sesuai. Itu memungkinkan Anda untuk melakukan refactor dengan perubahan kode minimal; jika metode yang melakukan pengaturan ini perlu dikeluarkan dari kelas dan diletakkan di tempat lain di mana bidang dukungan tidak lagi tersedia (seperti kelas dasar), siapa yang peduli? Anda menggunakan sesuatu yang tersedia di mana pun kelas itu sendiri untuk melakukan pekerjaan itu. Bidang dukungan, dalam banyak kasus, adalah detail implementasi; tidak seorang pun di luar kelas Anda yang seharusnya tahu itu ada.
Situasi utama yang dapat saya pikirkan ketika Anda harus menggunakan bidang dukungan dan BUKAN pengakses properti adalah ketika pengakses memiliki logika tambahan (validasi, atau memperbarui informasi status lainnya di kelas) yang tidak ingin Anda jalankan. Populasi awal suatu objek adalah contoh; Anda mungkin memiliki kelas yang menggunakan dua nilai properti untuk menghitung yang ketiga, yang juga disimpan di bidang dukungan (untuk alasan kegigihan). Ketika menginisialisasi salinan baru dari objek yang diberikan data dari DB, accessor properti yang masing-masing menghitung ulang nilai ketiga dapat mengeluh jika nilai yang dibutuhkan lainnya tidak ditetapkan. Dengan menggunakan bidang dukungan untuk menetapkan nilai awal dari dua (atau tiga) properti ini, Anda melewati logika validasi / kalkulasi hingga instance berada dalam kondisi yang cukup konsisten agar logika berfungsi normal.
sumber
Selalu gunakan yang masuk akal. Ya, saya tahu itu kedengarannya sangat palsu sampai-sampai tidak ada jawaban.
Inti dari properti adalah untuk menyediakan antarmuka di mana Anda dapat dengan aman mengakses model data. Untuk sebagian besar situasi, Anda selalu ingin mengakses model data dengan aman melalui antarmuka itu, seperti:
Namun dalam situasi lain, Anda mungkin hanya menggunakan properti sebagai tampilan model data:
Jika masuk akal untuk menggunakan bentuk radian
SomeAngle
, maka tentu saja gunakanlah itu.Pada akhirnya, pastikan untuk minum kool-aid Anda sendiri. Api yang menghadap ke publik Anda harus cukup tangguh untuk bekerja secara internal.
sumber