Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A required módosító azt jelzi, hogy az alkalmazott mezőt vagy tulajdonságotegy objektum inicializálójának kell inicializálnia. 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 C# nyelv referenciadokumentuma a C# nyelv legújabb kiadású verzióját ismerteti. Emellett a közelgő nyelvi kiadás nyilvános előzetes verziójú funkcióinak kezdeti dokumentációját is tartalmazza.
A dokumentáció azonosítja azokat a funkciókat, amelyeket először a nyelv utolsó három verziójában vagy az aktuális nyilvános előzetes verziókban vezetnek be.
Jótanács
Ha meg szeretné tudni, hogy mikor jelent meg először egy funkció a C#-ban, tekintse meg a C# nyelvi verzióelőzményeiről szóló cikket.
A módosító használatával a required fejlesztők olyan típusokat hozhatnak létre, ahol a tulajdonságokat vagy mezőket megfelelően inicializálni kell, de továbbra is engedélyezik az inicializálást az objektum inicializálóival. Ezt a viselkedést számos szabály biztosítja:
- Alkalmazza a módosítót a
requireddeklaráltstructclassmezőkre és tulajdonságokra, beleértve ésrecord structtípusokat isrecord. A módosító nem alkalmazható arequiredtagokrainterface. - Az explicit felületi implementációkat nem jelölheti meg .
requiredNem állíthatja be őket objektum inicializálókban. - Inicializálnia kell a szükséges tagokat, de inicializálhatja őket.
nullHa 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
publicosztály például nem tartalmazhat olyanrequiredmezőt, amelyprotected. Ezenkívül a szükséges tulajdonságoknak olyan állítókkal (setvagyinittartozékokkal) kell rendelkezniük, amelyek legalább olyan láthatóak, mint a típusok. A példányt létrehozó kód nem tudja beállítani a nem elérhető tagokat. - A származtatott osztályok nem rejthetik el az alaposztályban deklarált
requiredtagot. 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 arequiredmó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 arequiredmódosító értékét egy tulajdonság felülírásakor. - Ha a típusparaméter tartalmazza a
new()kényszert, nem használhat típusargumentumot egyetlen taggal semrequired. A fordító nem tudja kikényszeríteni, hogy az összes szükséges tag inicializálva van az általános kódban. - A deklaráció módosítóját nem használhatja
requireda rekord pozícióparamétereihez. Hozzáadhat explicit deklarációt egy olyan pozíciótulajdonsághoz, amely tartalmazza arequiredmó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 az attribútum 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
SetsRequiredMembersattribútummal ellátott másik konstruktorhoz láncolt konstruktornakthis()vagybase()is tartalmaznia kell aSetsRequiredMembersattribútumot. Ez biztosítja, hogy a hívók megfelelően használják az összes megfelelő konstruktort. - A
recordtípusú példánykonstruktorokSetsRequiredMembersattribútummal rendelkeznek, ha a tagok bármelyikerequired.
Figyelmeztetés
Az SetsRequiredMembers attribútum 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 és FirstName tulajdonságok LastName 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.