Bab Init-Only Properties di section Properties dan Encapsulation menunjukkan aksesor init sebagai pengganti set yang mengunci nilai setelah object dibuat. Bab ini membuka sisi internalnya: izin khusus yang tidak dimiliki set, kerja sama init dengan with pada struct, serta modreq IsExternalInit yang memengaruhi konsumsi pustaka.

Izin Khusus di Dalam init #

Di dalam aksesor init, compiler memperlakukan instance seolah masih berada di fase konstruksi. Konsekuensinya, init boleh menulis field readonly, sedangkan aksesor set tidak punya izin itu. Kemampuan inilah yang memungkinkan pattern encapsulasi: property tampil sebagai init, field aslinya readonly, dan instance tetap tak berubah setelah pembuatan.

Contoh: Field readonly dan Struct dengan with #

csharp
Kartu kartu = new Kartu { Nomor = "P-77" };
Console.WriteLine(kartu.Nomor);

Pengaturan malam = new Pengaturan { Volume = 30, Mode = "Malam" };
Pengaturan siang = malam with { Volume = 55 };
Console.WriteLine($"{malam.Volume} {malam.Mode}");
Console.WriteLine($"{siang.Volume} {siang.Mode}");

Output yang Dihasilkan:

text
P-77
30 Malam
55 Malam

Mari kita bedah baris demi baris:

  1. init => nomor = value: aksesor init menulis field readonly nomor; baris yang sama ditolak compiler bila aksesor diganti set.
  2. new Kartu { Nomor = "P-77" }: object initializer memanggil aksesor init tepat satu kali selama fase pembuatan.
  3. malam with { Volume = 55 }: with menyalin seluruh property struct lalu memanggil aksesor init untuk Volume; property lain menyalin nilai lamanya.
  4. Dua baris akhir: malam tetap 30 Malam dan siang menjadi 55 Malam; perubahan hanya berlaku pada instance baru.

Modreq IsExternalInit #

Aksesor init ditandai dengan modreq IsExternalInit di metadata. Modreq membuat compiler lama menolak pemanggilan, sehingga pustaka yang dikompilasi dengan SDK lama tidak dapat mengonsumsi anggota init tanpa langkah tambahan. Karena itu, pustaka multi-target biasanya menyatakan init hanya pada target yang mendukungnya, sementara struktur internal tetap memakai constructor.