Bab Required Members di section Properties dan Encapsulation membahas modifier required pada property: compiler menolak object initializer yang tidak mengisi anggota tersebut. Bab ini menuntaskan sisi lanjutannya. Modifier yang sama berlaku pada field, constructor beratribut [SetsRequiredMembers] membebaskan pemanggil dari initializer, dan with pada record memenuhi kontrak secara otomatis karena menyalin anggota dari instance sebelumnya.
Mekanisme pada Tiga Bentuk #
- Field biasa dapat ditandai
required, sehingga struct sederhana pun menuntut isian awal tanpa perlu property. - Atribut
[SetsRequiredMembers]pada constructor memberi tanda bahwa constructor itu sudah mengisi seluruh anggota required; pemanggilnya boleh menulisnew Akun(email)tanpa initializer. with-expression pada record menyalin semua anggota, termasuk yang required, sehingga instance hasilwithotomatis memenuhi kontrak yang sama.
Contoh: Record, Struct, dan Constructor #
var buku = new Produk { Kode = "B-101", Harga = 85000 };
Console.WriteLine($"{buku.Kode} {buku.Harga}");
var murah = buku with { Harga = 70000 };
Console.WriteLine($"{murah.Kode} {murah.Harga}");
Titik t = new Titik { X = 3, Y = 4 };
Console.WriteLine($"{t.X} {t.Y}");
Akun a = new Akun("[email protected]");
Console.WriteLine(a.Email);Output yang Dihasilkan:
B-101 85000
B-101 70000
3 4
[email protected]Mari kita bedah baris demi baris:
new Produk { ... }: propertyKodedanHargaditandairequireddengan aksesorinit; menghilangkan salah satunya menghentikan kompilasi.buku with { Harga = 70000 }:withmenyalinKodedari instance asal, sehingga kontrak required terpenuhi tanpa menuliskannya kembali.Titik { X = 3, Y = 4 }: pada struct,requireddipasang di field; kedua field wajib ada di initializer karena tidak ada nilai bawaan yang memenuhi kontrak.new Akun("[email protected]"): constructor ini beratribut[SetsRequiredMembers]dan mengisiEmaildi badannya, sehingga pemanggil tidak menulis initializer sama sekali.
Implikasi untuk Pustaka #
Kontrak required disimpan di metadata dan diperiksa compiler pemanggil. Pustaka yang menambahkan anggota required pada versi baru berpotensi membuat kode pemanggil lama gagal dikompilasi, karena initializer lama tidak mengisi anggota tersebut. Constructor beratribut [SetsRequiredMembers] menjadi jalur migrasi yang rapi: anggota baru diisi di dalam constructor, dan pemanggil lama tetap berjalan tanpa perubahan.