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 #
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:
P-77
30 Malam
55 MalamMari kita bedah baris demi baris:
init => nomor = value: aksesorinitmenulis fieldreadonly nomor; baris yang sama ditolak compiler bila aksesor digantiset.new Kartu { Nomor = "P-77" }: object initializer memanggil aksesorinittepat satu kali selama fase pembuatan.malam with { Volume = 55 }:withmenyalin seluruh property struct lalu memanggil aksesorinituntukVolume; property lain menyalin nilai lamanya.- Dua baris akhir:
malamtetap30 Malamdansiangmenjadi55 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.