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


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ált structmezőkre és tulajdonságokra alkalmazható, beleértve a class típusokat és record struct a típusokat isrecord. A required módosító nem alkalmazható a interfacetagokra.
  • 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 tagot nullinicializá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 amely protected. Ezenkívül a szükséges tulajdonságoknak olyan beá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 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 a required módosítót. A származtatott típus nem tudja eltávolítani az állapotot required . A származtatott típusok hozzáadhatják a required 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őleges required 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 a required 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()vagy base()tartalmaznia kell az SetsRequiredMembers attribútumot is. Ez biztosítja, hogy a hívók megfelelően használják az összes megfelelő konstruktort.
  • A típusokhoz recordSetsRequiredMembers 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.