Megosztás a következőn keresztül:


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 és structdeklarált tulajdonságokra, valamint class típusokra alkalmazható, beleértve record és record struct típusokat is. A required módosító nem alkalmazható egy interfacetagjaira.
  • 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 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 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 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.
  • A required tagokat tartalmazó típus nem használható típusargumentumként, ha a típusparaméter tartalmazza a new() 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 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 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

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.