pengubah yang diperlukan (Referensi C#)
Pengubah required
menunjukkan bahwa bidang atau properti yang diterapkannya harus diinisialisasi oleh penginisialisasi objek. Ekspresi apa pun yang menginisialisasi instans baru jenis harus menginisialisasi semua anggota yang diperlukan. Pengubah required
tersedia dimulai dengan 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 yang dideklarasikan dalamstruct
, danclass
jenis, termasukrecord
jenis danrecord struct
. Pengubahrequired
tidak dapat diterapkan ke anggotainterface
. - 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 kenull
. Pengkompilasi mengeluarkan kesalahan jika anggota tidak diinisialisasi sama sekali. - Anggota yang diperlukan harus setidaknya terlihat seperti jenis yang berisi. Misalnya,
public
kelas tidak boleh berisirequired
bidang yaituprotected
. Selain itu, properti yang diperlukan harus memiliki setter (set
atauinit
aksesor) 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 yang
required
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 pengubahrequired
. Jenis turunan tidak dapat menghapus statusrequired
. Jenis turunan dapat menambahkan pengubahrequired
saat mengambil alih properti. - Jenis dengan anggota apa pun
required
mungkin tidak digunakan sebagai argumen jenis ketika parameter jenis menyertakan batasannew()
. 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 pengubahrequired
.
Beberapa jenis, seperti rekaman posisional, menggunakan konstruktor utama untuk menginisialisasi properti posisional. Jika salah satu properti tersebut required
menyertakan pengubah, konstruktor utama menambahkan SetsRequiredMembers
atribut . Ini menunjukkan bahwa konstruktor utama menginisialisasi semua anggota yang diperlukan. Anda dapat menulis konstruktor Anda sendiri dengan System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute atribut . 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
SetsRequiredMembers
atribut , baikthis()
, ataubase()
, juga harus menyertakanSetsRequiredMembers
atribut . Itu memastikan bahwa penelepon dapat menggunakan semua konstruktor yang sesuai dengan benar. - Salin konstruktor yang dihasilkan untuk
record
jenis memilikiSetsRequiredMembers
atribut yang diterapkan jika salah satu anggota adalahrequired
.
Peringatan
SetsRequiredMembers
menonaktifkan pemeriksaan kompilator bahwa semua required
anggota diinisialisasi saat objek dibuat. Gunakan dengan hati-hati.
Kode berikut menunjukkan hierarki kelas yang menggunakan pengubah required
untuk FirstName
properti 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.