Aksesor init mengunci property setelah object dibuat, tetapi aksesor tersebut tidak menjamin property diisi. Object Konfigurasi tanpa Port tetap lolos compiler, dan kesalahan itu baru terlihat saat program berjalan. Sejak C# 11, modifier required menutup celah ini: property yang ditandai wajib ada di dalam object initializer, dan compiler menolak kode yang melewatkannya.
Masalah: Property Penting yang Lupa Diisi #
Class Pelanggan tidak berarti tanpa Nama dan Email. Bila kedua property itu hanya bertipe init, pemanggil baru dapat membuat object dengan kedua data kosong, dan program baru menyadari masalah ketika data dipakai. Kita butuh kontrak yang diperiksa compiler: object Pelanggan tidak sah bila Nama dan Email tidak diisi pada saat pembuatan.
Mekanisme Modifier required #
Modifier required ditempatkan sebelum tipe property:
- Property
requiredwajib muncul di dalam object initializer; compiler melaporkan galat bila satu pun tidak diisi. - Property
requiredjuga wajib memiliki aksesor yang bisa diisi, dan kombinasi yang lazim adalah{ get; init; }. - Property lain boleh tetap non-
requireddan menyediakan nilai bawaan, sehingga pemanggil hanya mengisi data yang memang wajib.
Aturan ini berlaku saat kompilasi, sehingga kelalaian pemanggil terdeteksi jauh sebelum program dijalankan.
Contoh: Class Pelanggan #
public class Pelanggan
{
public required string Nama { get; init; }
public required string Email { get; init; }
public string Level { get; init; } = "Reguler";
}
Pelanggan pelanggan = new Pelanggan
{
Nama = "Budi Santoso",
Email = "[email protected]"
};
Console.WriteLine($"Nama: {pelanggan.Nama}");
Console.WriteLine($"Email: {pelanggan.Email}");
Console.WriteLine($"Level: {pelanggan.Level}");Output yang Dihasilkan:
Nama: Budi Santoso
Email: [email protected]
Level: RegulerMari kita bedah baris demi baris:
public required string Nama { get; init; }: propertyNamawajib diisi dan hanya diisi pada object initializer; kombinasirequiredplusinitmenghasilkan data yang wajib ada sekaligus tidak dapat diubah.public string Level { get; init; } = "Reguler";: property tanparequiredmenyediakan nilai bawaan, sehingga pemanggil boleh melewatkannya.new Pelanggan { Nama = ..., Email = ... }: kedua propertyrequireddiisi di sini; bila salah satu tidak ada, compiler langsung menolak kode tersebut.Console.WriteLine($"Level: {pelanggan.Level}");: nilai bawaan"Reguler"terbaca dari output karena pemanggil tidak menimpanya.
error CS9035: Required member 'Pelanggan.Email' must be set in the object initializer or attribute constructor.