Bagikan melalui


modifikator wajib (Referensi C#)

Pengubah required menunjukkan bahwa bidang atau properti yang diterapkan harus diinisialisasi dengan penginisialisasi objek . Ekspresi apa pun yang menginisialisasi instans baru dari jenis tertentu harus menginisialisasi semua anggota yang diperlukan tersebut. Pengubah required tersedia mulai dari C# 11. Pengubah required memungkinkan pengembang untuk membuat jenis di mana properti atau bidang harus diinisialisasi dengan benar, namun masih mengizinkan inisialisasi menggunakan penginisialisasi objek. Beberapa aturan memastikan perilaku ini:

  • Pengubah required dapat diterapkan ke bidang dan properti dideklarasikan dalam jenis struct, dan class, termasuk jenis record dan record struct. Pengubah required tidak dapat diterapkan ke anggota interface.
  • Implementasi antarmuka eksplisit tidak dapat ditandai sebagai required. Mereka tidak dapat diatur dalam penginisialisasi objek.
  • Anggota yang diperlukan harus diinisialisasi, tetapi mereka dapat diinisialisasi ke null. Jika jenisnya adalah jenis referensi yang tidak dapat diubah ke null, pengkompilasi mengeluarkan peringatan jika Anda menginisialisasi anggota untuk null. Pengkompilasi mengeluarkan kesalahan jika anggota tidak diinisialisasi sama sekali.
  • Anggota yang diperlukan harus setidaknya terlihat seperti jenis yang berisi. Misalnya, kelas public tidak dapat berisi bidang required yang protected. Selain itu, properti yang diperlukan harus memiliki setter (set atau aksesor init) yang setidaknya terlihat seperti jenis yang berisi. Anggota yang tidak dapat diakses tidak dapat diatur oleh kode yang membuat instans.
  • Kelas turunan tidak dapat menyembunyikan anggota required yang dideklarasikan di kelas dasar. Menyembunyikan anggota yang diperlukan mencegah penelepon menggunakan penginisialisasi objek untuk itu. Selain itu, jenis turunan yang mengambil alih properti yang diperlukan harus menyertakan pengubah required. Jenis turunan tidak dapat menghapus status required. Jenis turunan dapat menambahkan modifier required saat menggantikan properti.
  • Jenis dengan anggota required apa pun mungkin tidak digunakan sebagai argumen jenis ketika parameter jenis menyertakan batasan new(). Pengkompilasi tidak dapat memberlakukan bahwa semua anggota yang diperlukan diinisialisasi dalam kode generik.
  • Pengubah required tidak diizinkan pada deklarasi untuk parameter posisi pada rekaman. Anda dapat menambahkan deklarasi eksplisit untuk properti posisional yang menyertakan pengubah required.

Beberapa jenis, seperti rekaman posisional , menggunakan konstruktor utama untuk menginisialisasi properti posisional. Jika salah satu properti tersebut menyertakan pengubah required, konstruktor utama menambahkan atribut SetsRequiredMembers. Ini menunjukkan bahwa konstruktor utama menginisialisasi semua anggota yang diperlukan. Anda dapat menulis konstruktor Anda sendiri dengan atribut System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute. Namun, kompilator tidak memverifikasi bahwa konstruktor ini menginisialisasi semua anggota yang diperlukan. Sebaliknya, atribut menegaskan kepada pengkompilasi bahwa konstruktor menginisialisasi semua anggota yang diperlukan. Atribut SetsRequiredMembers menambahkan aturan ini ke konstruktor:

  • Konstruktor yang menautkan ke konstruktor lain yang dianotasikan dengan atribut SetsRequiredMembers, baik this(), atau base(), juga harus menyertakan atribut SetsRequiredMembers. Hal itu memastikan bahwa pemanggil dapat menggunakan semua konstruktor yang sesuai dengan benar.
  • Konstruktor salinan yang dihasilkan untuk jenis record memiliki atribut SetsRequiredMembers diterapkan jika salah satu anggotanya adalah required.

Peringatan

SetsRequiredMembers menonaktifkan pemeriksaan kompilator bahwa semua anggota required diinisialisasi saat objek dibuat. Gunakan dengan hati-hati.

Kode berikut menunjukkan hierarki kelas yang menggunakan pengubah required untuk properti FirstName dan LastName:

public class Person
{
    public Person() { }

    [SetsRequiredMembers]
    public Person(string firstName, string lastName) =>
        (FirstName, LastName) = (firstName, lastName);

    public required string FirstName { get; init; }
    public required string LastName { get; init; }

    public int? Age { get; set; }
}

public class Student : Person
{
    public Student() : base()
    {
    }

    [SetsRequiredMembers]
    public Student(string firstName, string lastName) :
        base(firstName, lastName)
    {
    }

    public double GPA { get; set; }
}

Untuk informasi selengkapnya tentang anggota yang diperlukan, lihat spesifikasi fitur C#11 - Anggota yang diperlukan.