Catatan: Ini diposting ketika saya memulai C #. Dengan pengetahuan 2014, saya benar-benar dapat mengatakan bahwa properti otomatis adalah salah satu hal terbaik yang pernah terjadi pada bahasa C #.
Saya terbiasa membuat properti saya di C # menggunakan bidang pribadi dan publik:
private string title;
public string Title
{
get { return title; }
set { title = value; }
}
Sekarang, dengan .NET 3.0, kami mendapatkan properti otomatis:
public string Title { get; set; }
Saya tahu ini lebih merupakan pertanyaan filosofis / subyektif, tetapi apakah ada alasan untuk menggunakan properti otomatis ini kecuali dari menyimpan lima baris kode untuk setiap bidang? Keluhan pribadi saya adalah bahwa properti itu menyembunyikan barang-barang dari saya, dan saya bukan penggemar sihir hitam.
Bahkan, bidang pribadi yang tersembunyi bahkan tidak muncul di debugger, yang OK karena fakta bahwa fungsi get / set tidak melakukan apa-apa. Tetapi ketika saya ingin benar-benar mengimplementasikan beberapa logika pengambil / penyetel, saya tetap harus menggunakan pasangan pribadi / publik.
Saya melihat manfaat bahwa saya menyimpan banyak kode (satu vs enam baris) tanpa kehilangan kemampuan untuk mengubah logika pengambil / penyetel nanti, tapi sekali lagi saya sudah bisa melakukannya dengan hanya mendeklarasikan bidang publik "Public string Title" tanpa kebutuhan {get; set; } blok, bahkan menyimpan lebih banyak kode.
Jadi, apa yang saya lewatkan di sini? Mengapa ada orang yang benar-benar ingin menggunakan properti otomatis?
sumber
Jawaban:
Kami menggunakannya sepanjang waktu di Stack Overflow.
Anda juga mungkin tertarik dalam diskusi tentang Properties vs Variabel Publik . IMHO itulah yang merupakan reaksi terhadap hal ini, dan untuk tujuan itu, sangat bagus.
sumber
Ya, itu hanya menyimpan kode. Lebih mudah dibaca jika Anda memiliki banyak. Mereka lebih cepat menulis dan lebih mudah dirawat. Menyimpan kode selalu merupakan tujuan yang baik.
Anda dapat mengatur cakupan yang berbeda:
Sehingga properti hanya bisa diubah di dalam kelas. Ini tidak benar-benar berubah karena Anda masih dapat mengakses setter pribadi melalui refleksi.
Pada C # 6 Anda juga dapat membuat
readonly
properti benar - yaitu properti tidak dapat diubah yang tidak dapat diubah di luar konstruktor:Pada waktu kompilasi itu akan menjadi:
Di kelas yang tidak bisa diubah dengan banyak anggota, ini menyimpan banyak kode berlebih.
sumber
Tiga kerugian besar untuk menggunakan bidang alih-alih properti adalah:
sumber
Saya pribadi suka properti otomatis. Apa yang salah dengan menyimpan baris kode? Jika Anda ingin melakukan hal-hal dalam getter atau setter, tidak ada masalah untuk mengubahnya menjadi properti normal nanti.
Seperti yang Anda katakan, Anda bisa menggunakan bidang, dan jika Anda ingin menambahkan logika untuk nanti, Anda akan mengubahnya menjadi properti. Tapi ini mungkin menimbulkan masalah dengan penggunaan refleksi (dan mungkin di tempat lain?).
Juga properti memungkinkan Anda untuk mengatur tingkat akses yang berbeda untuk pengambil dan penyetel yang tidak dapat Anda lakukan dengan bidang.
Saya kira itu sama dengan kata kunci var. Masalah preferensi pribadi.
sumber
Dari Bjarne Stroustrup, pencipta C ++:
Dan tahukah Anda? Dia benar. Seberapa sering Anda hanya membungkus bidang pribadi dalam get and set, tanpa benar-benar melakukan apa pun dalam get / set, hanya karena itu adalah "berorientasi objek" yang harus dilakukan. Ini adalah solusi Microsoft untuk masalah ini; mereka pada dasarnya adalah bidang publik yang dapat Anda ikat.
sumber
Satu hal yang tampaknya tidak disebutkan oleh siapa pun adalah bagaimana sifat-otomatis sayangnya tidak berguna untuk objek yang tidak dapat diubah (biasanya struct yang tidak dapat diubah). Karena untuk itu Anda benar-benar harus melakukan:
(tempat bidang diinisialisasi dalam konstruktor melalui parameter yang diteruskan, dan kemudian hanya dibaca.)
Jadi ini memiliki kelebihan dibanding yang sederhana
get
/private set
autoproperti.sumber
public string Title { get; private set; }
menghasilkan hal yang persis sama? Anda akan dapat mengubahnya dari dalam kelas maka tentu saja, tetapi jika Anda melakukannya Anda memiliki masalah lain ...: ppublic string Title { get; private readonly set; }
Saya selalu membuat properti alih-alih bidang publik karena Anda bisa menggunakan properti dalam definisi antarmuka, Anda tidak bisa menggunakan bidang publik dalam definisi antarmuka.
sumber
Properti otomatis adalah sihir hitam seperti yang lainnya di C #. Setelah Anda memikirkannya dalam hal kompilasi ke IL daripada diperluas ke properti C # normal terlebih dahulu itu jauh lebih sedikit ilmu hitam daripada banyak konstruksi bahasa lainnya.
sumber
Saya menggunakan properti otomatis sepanjang waktu. Sebelum C # 3 saya tidak bisa diganggu dengan semua pengetikan dan hanya menggunakan variabel publik saja.
Satu-satunya hal yang saya lewatkan adalah dapat melakukan ini:
Anda harus mengubah default ke konstruktor Anda dengan properti. membosankan :-(
sumber
public string Name { get; set; } = "DefaultName";
blogs.msdn.com/b/csharpfaq/archive/2014/11/20/…Saya pikir setiap konstruksi yang intuitif DAN mengurangi garis kode adalah nilai tambah yang besar.
Jenis-jenis fitur itulah yang membuat bahasa seperti Ruby begitu kuat (fitur itu dan dinamis, yang juga membantu mengurangi kelebihan kode).
Ruby telah memiliki ini selama:
sumber
Satu-satunya masalah yang saya miliki dengan mereka adalah bahwa mereka tidak cukup jauh. Rilis yang sama dari kompiler yang menambahkan properti otomatis, menambahkan metode parsial. Mengapa mereka tidak menggabungkan keduanya adalah di luar jangkauan saya. "Parsial Pada <PropertyName> Berubah" yang sederhana akan membuat hal-hal ini benar-benar bermanfaat.
sumber
Sederhana, pendek, dan jika Anda ingin membuat implementasi nyata di dalam tubuh properti di suatu tempat, itu tidak akan merusak antarmuka eksternal tipe Anda.
Sesimpel itu.
sumber
Satu hal yang perlu diperhatikan di sini adalah bahwa, menurut pemahaman saya, ini hanyalah gula sintaksis pada ujung C # 3.0, yang berarti bahwa IL yang dihasilkan oleh kompiler adalah sama. Saya setuju tentang menghindari ilmu hitam, tetapi semua sama, lebih sedikit garis untuk hal yang sama biasanya merupakan hal yang baik.
sumber
Menurut pendapat saya, Anda harus selalu menggunakan properti otomatis alih-alih bidang publik. Yang mengatakan, inilah kompromi:
Mulailah dengan bidang internal menggunakan konvensi penamaan yang akan Anda gunakan untuk properti. Ketika Anda pertama kali juga
Melakukan hal ini:
Kode klien Anda tidak perlu diubah.
Namun, suatu hari nanti, sistem Anda akan tumbuh dan Anda akan menguraikannya menjadi rakitan terpisah dan beberapa solusi. Ketika itu terjadi, setiap bidang yang terbuka akan kembali menghantui Anda karena, seperti yang disebutkan Jeff, mengubah bidang publik menjadi properti publik adalah melanggar perubahan API .
sumber
Saya menggunakan CodeRush, ini lebih cepat daripada properti otomatis.
Untuk melakukan ini:
Membutuhkan total delapan penekanan tombol.
sumber
Nah dengan potongan kode properti-otomatis dengan nama yang sama akan menjadi tujuh penekanan tombol total;)
sumber
@Domenic: Saya tidak mengerti .. tidak bisakah Anda melakukan ini dengan properti-otomatis ?:
atau
Apakah ini yang Anda maksud?
sumber
Keluhan terbesar saya dengan properti otomatis adalah bahwa mereka dirancang untuk menghemat waktu, tetapi saya sering menemukan saya harus mengembangkannya menjadi properti yang penuh sesak nanti.
Apa yang VS2008 hilang adalah sebuah refactor Auto-Property yang meledak .
Fakta kami memiliki refactor bidang enkapsulasi membuat cara saya bekerja lebih cepat untuk hanya menggunakan bidang publik.
sumber