Kita sering diberitahu bahwa kita harus melindungi enkapsulasi dengan membuat metode pengambil dan penyetel (properti dalam C #) untuk bidang kelas, alih-alih memaparkan bidang ke dunia luar.
Tetapi ada beberapa kali ketika sebuah bidang hanya ada untuk menyimpan nilai dan tidak memerlukan perhitungan apa pun untuk mendapatkan atau mengatur. Untuk ini kita semua akan melakukan nomor ini:
public class Book
{
private string _title;
public string Title
{
get{ return _title; }
set{ _title = value; }
}
}
Yah, aku punya pengakuan, aku tidak tahan menulis semua itu (sungguh, itu tidak harus menulisnya, itu harus melihatnya), jadi aku pergi nakal dan menggunakan bidang publik.
Kemudian muncullah C # 3.0 dan saya melihat mereka menambahkan properti otomatis:
public class Book
{
public string Title {get; set;}
}
yang lebih rapi, dan saya berterima kasih untuk itu, tapi sungguh, apa yang berbeda dari hanya membuat bidang publik?
public class Book
{
public string Title;
}
sumber
prop
potongan kode membuatnya cepat untuk membuat properti. Cukup ketikprop
lalu tab.Jawaban:
Dalam pertanyaan terkait yang saya miliki beberapa waktu lalu, ada tautan ke sebuah posting di blog Jeff, menjelaskan beberapa perbedaan.
Properti vs Variabel Publik
Mengubah variabel ke properti adalah perubahan besar. Sebagai contoh:
sumber
ref
atauout
kata kunci), sementara properti adalah sepasang pengakses dan tidak dapat diteruskan oleh referensi. Misalnyabool success = TryGetMyTitle(out myBook.Title);
penggunaan yangout
akan bekerja dengan bidang dan tidak bekerja dengan properti. Ini adalah contoh jelas mengapa perubahan dari bidang ke properti merupakan perubahan besar!ref
/out
, dan kemudian mengatur properti ke nilai yang dimiliki variabel lokal. Tetapi kemudian metode yang dipanggil tidak mengakses properti itu sendiri, ia mengakses variabel lokal yang Anda buat di sana.public int Foo { get; }
yang akan membuat properti otomatis dengan bidang dukungan hanya baca.Mengabaikan masalah API, hal yang saya anggap paling berharga tentang penggunaan properti adalah debugging.
Debugger CLR tidak mendukung titik-titik pemutusan data (sebagian besar debugger asli melakukannya). Oleh karena itu tidak mungkin untuk menetapkan titik istirahat pada membaca atau menulis bidang tertentu di kelas. Ini sangat terbatas dalam skenario debugging tertentu.
Karena properti diimplementasikan sebagai metode yang sangat tipis, dimungkinkan untuk menetapkan breakpoint pada baca dan tulis nilai-nilainya. Ini memberi mereka kaki besar di atas bidang.
sumber
Mengubah dari bidang ke properti akan memutus kontrak (mis. Mengharuskan semua kode referensi untuk dikompilasi ulang). Jadi, ketika Anda memiliki titik interaksi dengan kelas lain - anggota publik (dan umumnya dilindungi), Anda ingin merencanakan pertumbuhan di masa depan. Lakukan dengan selalu menggunakan properti.
Bukan apa-apa untuk menjadikannya properti otomatis hari ini, dan 3 bulan kemudian sadar bahwa Anda ingin menjadikannya malas, dan beri centang nol pada pengambil. Jika Anda telah menggunakan bidang, ini adalah perubahan kompilasi terbaik dan tidak mungkin paling buruk, tergantung pada siapa & apa lagi yang bergantung pada majelis Anda.
sumber
Hanya karena tidak ada yang menyebutkannya: Anda tidak bisa mendefinisikan bidang di Antarmuka. Jadi, jika Anda harus mengimplementasikan antarmuka spesifik yang mendefinisikan properti, properti otomatis terkadang merupakan fitur yang sangat bagus.
sumber
Perbedaan besar yang sering diabaikan dan tidak disebutkan dalam jawaban lain: overriding . Anda dapat mendeklarasikan properti virtual dan menimpanya sementara Anda tidak dapat melakukan hal yang sama untuk bidang anggota publik.
sumber
Ini semua tentang versi dan stabilitas API. Tidak ada perbedaan, dalam versi 1 - tetapi nanti, jika Anda memutuskan Anda harus menjadikan ini properti dengan beberapa jenis pemeriksaan kesalahan pada versi 2, Anda tidak perlu mengubah API Anda - tidak ada perubahan kode, di mana pun, selain definisi properti.
sumber
Keuntungan lain dari properti yang diimplementasikan otomatis di bidang publik adalah bahwa Anda dapat membuat set accessors menjadi pribadi atau terlindungi, memberikan kelas objek di mana ia didefinisikan sebagai kontrol yang lebih baik daripada bidang publik.
sumber
Tidak ada yang salah dalam membuat bidang
public
. Tapi ingat membuatgetter/setter
denganprivate
bidang bukan enkapsulasi. IMO, Jika Anda tidak peduli dengan fitur lain dariProperty
, Anda mungkin juga membuatnyapublic
.sumber
Jika Anda memutuskan nanti untuk memeriksa apakah judulnya unik, dengan membandingkan koleksi atau database, Anda bisa melakukannya di properti tanpa mengubah kode apa pun yang bergantung padanya.
Jika Anda hanya menggunakan atribut publik maka Anda akan kurang fleksibel.
Fleksibilitas ekstra tanpa memutus kontrak adalah hal yang paling penting bagi saya tentang penggunaan properti, dan, sampai saya benar-benar membutuhkan fleksibilitas, pembuatan-otomatis paling masuk akal.
sumber
Satu hal yang saya temukan sangat berguna serta semua kode dan alasan pengujian adalah bahwa jika itu adalah properti vs bidang adalah bahwa Visual Studio IDE menunjukkan kepada Anda referensi untuk properti tetapi bukan bidang.
sumber
Setelah saya melakukan beberapa penelitian
Itu benar-benar memberi kita lebih banyak kemungkinan dan kemungkinan diperpanjang.
sumber