kötelező módosító (C# referencia)
A required
módosító azt jelzi, hogy az alkalmazott mezőt vagy tulajdonságot egy objektum-inicializálónak kell inicializálnia. Az új típusú példányt inicializáló kifejezéseknek inicializálniuk kell az összes szükséges tagot. A required
módosító a C# 11-től kezdve érhető el. A required
módosító lehetővé teszi a fejlesztők számára, hogy olyan típusokat hozzanak létre, ahol a tulajdonságokat vagy mezőket megfelelően inicializálni kell, de továbbra is engedélyezik az inicializálást objektum inicializálókkal. Ezt a viselkedést számos szabály biztosítja:
- A
required
módosító a következőben deklaráltstruct
mezőkre és tulajdonságokra alkalmazható, beleértve aclass
típusokat ésrecord struct
a típusokat isrecord
. Arequired
módosító nem alkalmazható ainterface
tagokra. - Az explicit felület implementációi nem jelölhetők meg
required
. Nem állíthatók be objektum inicializálókban. - A szükséges tagokat inicializálni kell, de inicializálhatók.
null
Ha a típus nem null értékű hivatkozástípus, a fordító figyelmeztetést ad ki, ha a tagotnull
inicializálja. A fordító hibát ad ki, ha a tag inicializálása egyáltalán nem történik meg. - A szükséges tagoknak legalább olyan láthatónak kell lenniük, mint a bennük található típusnak. Egy osztály például nem tartalmazhat
required
olyan mezőt,public
amelyprotected
. Ezenkívül a szükséges tulajdonságoknak olyan beállítókkal (set
vagyinit
tartozékokkal) kell rendelkezniük, amelyek legalább olyan láthatóak, mint a típusok. A nem elérhető tagok nem állíthatók be példányt létrehozó kóddal. - A származtatott osztályok nem rejthetik el
required
az alaposztályban deklarált tagokat. A szükséges tag elrejtése megakadályozza, hogy a hívók objektum inicializálókat használjanak hozzá. Ezenkívül a szükséges tulajdonságot felülbíráló származtatott típusoknak tartalmazniuk kell arequired
módosítót. A származtatott típus nem tudja eltávolítani az állapototrequired
. A származtatott típusok hozzáadhatják arequired
módosító elemet egy tulajdonság felülírásakor. - Ha a típusparaméter tartalmazza a
new()
kényszert, nem használható típusargumentumként egy tetszőlegesrequired
taggal rendelkező típus. A fordító nem tudja kikényszeríteni, hogy az összes szükséges tag inicializálva van az általános kódban. - A
required
módosító nem engedélyezett a rekord pozícióparamétereinek deklarációjában. Explicit deklarációt adhat hozzá egy olyan pozíciótulajdonsághoz, amely tartalmazza arequired
módosítót.
Egyes típusok, például a pozíciórekordok elsődleges konstruktor használatával inicializálják a pozíciótulajdonságokat. Ha ezen tulajdonságok bármelyike tartalmazza a required
módosítót, az elsődleges konstruktor hozzáadja az SetsRequiredMembers
attribútumot. Ez azt jelzi, hogy az elsődleges konstruktor inicializálja az összes szükséges tagot. Az attribútummal System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute saját konstruktort is írhat. A fordító azonban nem ellenőrzi, hogy ezek a konstruktorok inicializálják-e az összes szükséges tagot. Az attribútum inkább azt állítja a fordítónak, hogy a konstruktor inicializálja az összes szükséges tagot. Az SetsRequiredMembers
attribútum hozzáadja ezeket a szabályokat a konstruktorokhoz:
- Egy olyan konstruktornak, amely egy másik konstruktorhoz láncolt, és az
SetsRequiredMembers
attribútummal van elfűzve,this()
vagybase()
tartalmaznia kell azSetsRequiredMembers
attribútumot is. Ez biztosítja, hogy a hívók megfelelően használják az összes megfelelő konstruktort. - A típusokhoz
record
SetsRequiredMembers
létrehozott másoláskonstruktorok az attribútumot alkalmazzák, ha a tagok bármelyike.required
Figyelmeztetés
Ez SetsRequiredMembers
letiltja a fordító azon ellenőrzését, hogy az összes required
tag inicializálva legyen egy objektum létrehozásakor. Óvatosan használja.
Az alábbi kód egy osztályhierarchiát mutat be, amely a required
módosítót használja a tulajdonságokhoz és LastName
a FirstName
tulajdonságokhoz:
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; }
}
A szükséges tagokról további információt a C#11 – Kötelező tagok funkció specifikációja tartalmaz.