Megosztás:


megkövetelt modifikátor (C# referencia)

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 required deklarált structclassmezőkre és tulajdonságokra, beleértve és record struct típusokat isrecord. A módosító nem alkalmazható a required tagokra interface.
  • Az explicit felületi implementációkat nem jelölheti meg .required Nem állíthatja be őket objektum inicializálókban.
  • Inicializálnia kell a szükséges tagokat, de inicializálhatja őket.null Ha a típus nem null értékű hivatkozástípus, a fordító figyelmeztetést ad ki, ha a tagot null-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 olyan required mezőt, amely protected. Ezenkívül a szükséges tulajdonságoknak olyan állítókkal (set vagy init tartozé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 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 a required módosító értékét. A származtatott típus nem tudja eltávolítani a required állapotot. A származtatott típusok hozzáadhatják a required mó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 required a rekord pozícióparamétereihez. Hozzáadhat explicit deklarációt egy olyan pozíciótulajdonsághoz, amely tartalmazza a required 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 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 SetsRequiredMembers attribútummal ellátott másik konstruktorhoz láncolt konstruktornak this()vagy base()is tartalmaznia kell a SetsRequiredMembers 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ánykonstruktorok SetsRequiredMembers attribútummal rendelkeznek, ha a tagok bármelyike required.

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.