Saya membuat properti otomatis:
public int Foo { get; }
Ini hanya pengambil. Tetapi ketika saya membangun konstruktor, saya dapat mengubah nilainya:
public MyClass(string name)
{
Foo = 5;
}
Mengapa mungkin, meskipun ini hanya untuk mendapatkan?
Jawaban:
Ini adalah fitur C # 6 baru, "Getter-only auto-properties", juga dikenal sebagai "Auto-Property Initializers untuk Read-Only Properties" seperti yang dibahas dalam artikel majalah MSDN ini 'C #: The New and Improved C # 6.0' oleh Mark Michaelis dan dalam spesifikasi Bahasa draf C # 6.0 .
Penyetel bidang hanya baca hanya dapat diakses di konstruktor, dalam semua skenario lainnya, bidang masih hanya baca dan berperilaku seperti sebelumnya.
Ini adalah sintaks praktis untuk mengurangi jumlah kode yang perlu Anda ketik dan untuk menghilangkan kebutuhan untuk secara eksplisit mendeklarasikan variabel level modul privat untuk menampung nilai.
Fitur ini dipandang sama pentingnya dengan, sejak diperkenalkannya Properti yang Diimplementasikan Otomatis di C # 3, properti yang dapat diubah (yang memiliki pengambil dan penyetel) menjadi lebih cepat untuk menulis daripada yang tidak dapat diubah (yang hanya memiliki pengambil), artinya orang-orang tergoda untuk menggunakan properti yang bisa berubah untuk menghindari keharusan mengetik kode untuk bidang dukungan yang biasanya diperlukan untuk properti hanya-baca. Ada lebih banyak diskusi tentang properti yang Diimplementasikan Otomatis di bagian yang relevan dari Panduan Pemrograman Microsoft C # .
Postingan blog ini, '# 1,207 - C # 6.0 - Penginisialisasi Properti Otomatis untuk Properti Hanya-Baca' oleh Sean Sexton Memiliki penjelasan dan contoh yang baik sebagai berikut:
Detail lebih lanjut juga dapat ditemukan di repo dotnet Roslyn di GitHub :
dan dalam draf C # 6.0 Spesifikasi Bahasa (NB: Spesifikasi bahasa adalah final sejauh menyangkut Microsoft, tetapi belum disetujui sebagai standar EMCA / ISO , oleh karena itu 'draf'):
sumber
CS0200 C# Property or indexer cannot be assigned to -- it is read only
saat menggunakan properti biasa. Apakah "properti otomatis khusus pengambil" dianggap hanya baca atau tidak?Ini adalah fitur baru di C # 6 yang memungkinkan Anda membuat properti hanya-baca dan menginisialisasi nilainya dari konstruktor (atau sebaris saat Anda mendeklarasikannya).
Jika Anda mencoba mengubah nilai properti ini di luar konstruktor, itu akan memberi Anda kesalahan kompilasi.
Ini hanya-baca dalam arti bahwa setelah Anda menginisialisasi nilainya (sebaris atau di dalam konstruktor), Anda tidak dapat mengubah nilainya.
sumber
Jika tidak mungkin untuk menginisialisasi properti hanya-baca dari konstruktor (atau penginisialisasi properti otomatis), maka itu akan sia-sia, karena itu akan selalu mengembalikan nilai default untuk tipenya (0 untuk numerik, null untuk tipe referensi ). Semantik yang sama diterapkan ke bidang hanya baca di semua versi C #.
Untuk mendefinisikan properti getter-only (yang tidak dapat diinisialisasi dari konstruktor), Anda perlu menentukan apa yang dikembalikan sebagai bagian dari definisi:
Atau, lebih tepatnya di C # 6:
sumber
"Properti yang diterapkan secara otomatis hanya baca"
Pertama-tama saya ingin menjelaskan bahwa properti itu suka
Dikenal sebagai "properti yang diterapkan secara otomatis hanya baca"
Untuk memverifikasi ini, Anda dapat menjalankan & memeriksa kode di atas dengan Visual Studio. Jika Anda mengubah versi bahasa dari C # 6.0 ke C # 5.0 maka compiler akan membuang pengecualian berikut Fitur 'properti yang diimplementasikan secara otomatis dapat dibaca' tidak tersedia di C # 5. Harap gunakan bahasa versi 6 atau lebih tinggi.
untuk mengubah versi bahasa C # kunjungi di sini
Sekarang saya sampai pada pertanyaan kedua Anda
“Ini hanya getter. Tapi ketika saya membangun konstruktor, saya bisa mengubah nilainya ”
Microsoft memperkenalkan "properti yang diimplementasikan secara otomatis baca" pada logika hanya baca. Seperti yang kita ketahui bahwa kata kunci “readonly” tersedia dari C # 1.0. kita menggunakan kata kunci "readonly" sebagai pengubah pada sebuah field dan field tersebut dapat diberikan dalam 2 cara baik pada saat deklarasi atau dalam sebuah konstruktor di kelas yang sama.
Dengan cara yang sama, nilai "properti yang diterapkan secara otomatis hanya baca" dapat ditetapkan dalam 2 cara
Way1 (pada saat deklarasi):
Way2 (dalam konstruktor di kelas yang sama)
Properti Hanya Baca Saja
Jika Anda mencari properti Readonly murni maka lakukanlah ini
sekarang Anda tidak dapat menetapkan nilai propery "FullName" dari konstruktor. Jika Anda mencoba melakukannya, pengecualian berikut akan muncul
"Properti atau pengindeks 'Person.FullName' tidak dapat ditetapkan ke - ini hanya baca"
sumber
Fitur properti otomatis ditambahkan ke bahasa selama rilis C # 3.0. Ini memungkinkan Anda untuk menentukan properti tanpa bidang dukungan apa pun, namun Anda masih perlu menggunakan konstruktor untuk menginisialisasi properti otomatis ini ke nilai non-default. C # 6.0 memperkenalkan fitur baru yang disebut penginisialisasi properti otomatis yang memungkinkan Anda menginisialisasi properti ini tanpa konstruktor seperti di bawah ini:
Anda dapat menemukan informasi lebih lanjut tentang ini di sini
sumber
Variabel yang dideklarasikan
readonly
dapat ditulis dalam konstruktor, tetapi dalam bahasa yang menghormati atributnya, tidak dapat diubah setelah konstruktor kembali. Qualifier itu disediakan sebagai fitur bahasa karena sering kali diperlukan untuk bidang yang nilainya akan bervariasi berdasarkan parameter konstruktor (artinya mereka tidak dapat diinisialisasi sebelum konstruktor dimulai) tetapi tidak perlu berubah setelah konstruktor kembali, tapi itu hanya dapat digunakan untuk variabel yang diekspos sebagai bidang. Semantik darireadonly
bidang -kualifikasi dalam banyak kasus akan sempurna untuk anggota publik kecuali bahwa seringkali lebih baik bagi kelas untuk mengekspos anggota - bahkan yang tidak dapat diubah - sebagai properti daripada bidang.Seperti halnya properti otomatis baca-tulis yang memungkinkan kelas mengekspos properti yang dapat berubah semudah kolom biasa, properti otomatis hanya-baca juga ada untuk memungkinkan kelas mengekspos properti yang tidak dapat diubah semudah
readonly
kolom-kolom yang memenuhi syarat. Sepertireadonly
bidang yang memenuhi syarat dapat ditulis dalam konstruktor, demikian juga dengan properti get-only.sumber