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:
Sebelum C # 6.0, jika Anda menginginkan properti hanya-baca (tidak dapat diubah), Anda biasanya menggunakan bidang dukungan hanya-baca yang diinisialisasi dalam konstruktor, seperti yang ditunjukkan di bawah ini.
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
private readonly DateTime creTime;
public DateTime DogCreationTime
{
get { return creTime; }
}
public Dog(string name)
{
Name = name;
creTime = DateTime.Now;
}
}
Di C # 6.0, Anda dapat menggunakan properti yang diimplementasikan secara otomatis untuk mengimplementasikan properti hanya-baca. Anda melakukan ini dengan menggunakan penginisialisasi properti otomatis. Hasilnya jauh lebih bersih daripada contoh di atas, di mana kami harus secara eksplisit mendeklarasikan bidang dukungan.
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
public DateTime DogCreationTime { get; } = DateTime.Now;
public Dog(string name)
{
Name = name;
}
}
Detail lebih lanjut juga dapat ditemukan di repo dotnet Roslyn di GitHub :
Properti otomatis sekarang dapat dideklarasikan tanpa penyetel.
Bidang dukungan dari properti otomatis khusus pengambil secara implisit dideklarasikan sebagai hanya baca (meskipun ini hanya penting untuk tujuan refleksi). Ini dapat diinisialisasi melalui penginisialisasi pada properti seperti pada contoh di atas. Selain itu, properti getter-only bisa ditetapkan ke dalam badan konstruktor tipe yang mendeklarasikan, yang menyebabkan nilai ditetapkan langsung ke bidang yang mendasarinya:
Ini tentang mengekspresikan tipe secara lebih ringkas, tetapi perhatikan bahwa ini juga menghilangkan perbedaan penting dalam bahasa antara tipe yang bisa berubah dan tipe yang tidak bisa diubah: properti-otomatis adalah singkatan yang hanya tersedia jika Anda ingin membuat kelas Anda bisa berubah, dan jadi godaan untuk default itu bagus. Sekarang, dengan properti otomatis khusus pengambil, bidang permainan telah diratakan antara dapat berubah dan tidak dapat diubah.
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'):
Properti yang diterapkan secara otomatis
Properti yang diimplementasikan secara otomatis (atau disingkat properti otomatis), adalah properti non-abstrak non-eksternal dengan badan pengakses khusus titik koma. Properti otomatis harus memiliki aksesor get dan secara opsional dapat memiliki set pengakses.
Ketika sebuah properti ditetapkan sebagai properti yang diimplementasikan secara otomatis, bidang dukungan tersembunyi secara otomatis tersedia untuk properti tersebut, dan pengakses diimplementasikan untuk membaca dan menulis ke bidang dukungan tersebut. Jika properti otomatis tidak memiliki pengakses yang ditetapkan, bidang dukungan dianggap hanya baca (bidang Hanya baca). Sama seperti bidang hanya-baca, properti-otomatis khusus pengambil juga dapat ditetapkan ke dalam isi konstruktor kelas yang melingkupi. Penetapan seperti itu diberikan langsung ke bidang dukungan hanya baca dari properti.
Properti-otomatis secara opsional memiliki properti_inisialisasi, yang diterapkan langsung ke bidang dukungan sebagai variabel_inisialisasi (Penginisialisasi variabel).