megkövetelt modifikátor (C# referencia)
A required
módosító azt jelzi, hogy a mezőt vagy a tulajdonságot egy objektum inicializálóvalkell inicializálni. Minden olyan kifejezésnek, amely inicializál egy új példányt, inicializálnia kell az összes szükséges tagot. A required
módosító a C# 11-től érhető el. A required
módosító lehetővé teszi a fejlesztők számára, hogy olyan típusokat hozzanak létre, amelyekben a tulajdonságokat vagy mezőket megfelelően inicializálni kell, de továbbra is engedélyezik az inicializálást objektum-inicializálók használatával. Ezt a viselkedést számos szabály biztosítja:
- A
required
módosító mezőkre ésstruct
deklarált tulajdonságokra, valamintclass
típusokra alkalmazható, beleértverecord
ésrecord struct
típusokat is. Arequired
módosító nem alkalmazható egyinterface
tagjaira. - Az explicit felületi implementációk 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 a
null
értékre. Ha a típus nem null értékű hivatkozástípus, a fordító figyelmeztetést ad ki, ha a tagotnull
-ra 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 annyira láthatónak kell lenniük, mint az őket tartalmazó típusnak. Egy
public
osztály például nem tartalmazhat olyanrequired
mezőt, amelyprotected
. Ezenkívül a szükséges tulajdonságoknak olyan á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 az alaposztályban deklarált
required
tagot. 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ó értékét. A származtatott típus nem tudja eltávolítani arequired
állapotot. A származtatott típusok hozzáadhatják arequired
módosító értékét egy tulajdonság felülírásakor. - A
required
tagokat tartalmazó típus nem használható típusargumentumként, ha a típusparaméter tartalmazza anew()
korlátozást. 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 helyparamétereinek deklarációjában. Hozzáadhat explicit deklarációt egy olyan pozíciótulajdonsághoz, amely tartalmazza arequired
módosító értékét.
Egyes típusok, mint például a pozíciórekordok, egy elsődleges konstruktor használatával inicializálják a pozíciós tulajdonságokat. Ha ezen tulajdonságok bármelyike tartalmazza a required
módosítóját, az elsődleges konstruktor hozzáadja a SetsRequiredMembers
attribútumot. Ez azt jelzi, hogy az elsődleges konstruktor inicializálja az összes szükséges tagot. Saját konstruktort írhat a System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute attribútummal. 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. A SetsRequiredMembers
attribútum ezeket a szabályokat adja hozzá a konstruktorokhoz:
- A
SetsRequiredMembers
attribútummal ellátott másik konstruktorhoz láncolt konstruktornakthis()
vagybase()
is tartalmaznia kell aSetsRequiredMembers
attribútumot. Ez biztosítja, hogy a hívók megfelelően használják az összes megfelelő konstruktort. - A
record
típusú példánykonstruktorokSetsRequiredMembers
attribútummal rendelkeznek, ha a tagok bármelyikerequired
.
Figyelmeztetés
A 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 FirstName
és LastName
tulajdonságok required
módosítóját használja:
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óban talál.