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 required wajib muncul di dalam object initializer; compiler melaporkan galat bila satu pun tidak diisi.
  • Property required juga wajib memiliki aksesor yang bisa diisi, dan kombinasi yang lazim adalah { get; init; }.
  • Property lain boleh tetap non-required dan 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 #

csharp
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:

text
Nama: Budi Santoso
Email: [email protected]
Level: Reguler

Mari kita bedah baris demi baris:

  1. public required string Nama { get; init; }: property Nama wajib diisi dan hanya diisi pada object initializer; kombinasi required plus init menghasilkan data yang wajib ada sekaligus tidak dapat diubah.
  2. public string Level { get; init; } = "Reguler";: property tanpa required menyediakan nilai bawaan, sehingga pemanggil boleh melewatkannya.
  3. new Pelanggan { Nama = ..., Email = ... }: kedua property required diisi di sini; bila salah satu tidak ada, compiler langsung menolak kode tersebut.
  4. Console.WriteLine($"Level: {pelanggan.Level}");: nilai bawaan "Reguler" terbaca dari output karena pemanggil tidak menimpanya.
text
error CS9035: Required member 'Pelanggan.Email' must be set in the object initializer or attribute constructor.