required modifier (Referenční dokumentace jazyka C#)

required Modifikátor označuje, že pole nebo vlastnost, na které se použije, musí být inicializována inicializátorem objektu. Libovolný výraz, který inicializuje novou instanci typu, musí inicializovat všechny požadované členy. Modifikátor required je k dispozici od jazyka C# 11. required Modifikátor umožňuje vývojářům vytvářet typy, ve kterých musí být správně inicializovány vlastnosti nebo pole, ale přesto umožňuje inicializaci pomocí inicializátorů objektů. Toto chování zajišťuje několik pravidel:

  • required Modifikátor lze použít pro pole a vlastnosti deklarované v struct, a class typy, včetně record a record struct typy. required Modifikátor nelze použít u členů objektu interface.
  • Explicitní implementace rozhraní nelze označit jako required. Nelze je nastavit v inicializátorech objektů.
  • Požadované členy musí být inicializovány, ale mohou být inicializovány na null. Pokud je typ odkazem bez hodnoty null, kompilátor vydá upozornění, pokud inicializujete člena na null. Kompilátor vydá chybu, pokud člen vůbec není inicializován.
  • Požadované členy musí být alespoň tak viditelné jako jejich typ. Třída například public nemůže obsahovat required pole, které je protected. Požadované vlastnosti navíc musí obsahovatttery (set nebo init přístupové objekty), které jsou alespoň tak viditelné jako jejich typy. Členy, které nejsou přístupné, není možné nastavit pomocí kódu, který vytvoří instanci.
  • Odvozené třídy nemohou skrýt required člen deklarovaný v základní třídě. Skrytím požadovaného členu zabráníte volajícím v použití inicializátorů objektů. Kromě toho odvozené typy, které přepisovat požadovanou vlastnost musí obsahovat required modifikátor. Odvozený typ nemůže odebrat required stav. Odvozené typy mohou přidat required modifikátor při přepsání vlastnosti.
  • Typ s libovolnými required členy nelze použít jako argument typu, pokud parametr typu obsahuje new() omezení. Kompilátor nemůže vynutit inicializaci všech požadovaných členů v obecném kódu.
  • required Modifikátor není u deklarace pro poziční parametry záznamu povolen. Můžete přidat explicitní deklaraci pro poziční vlastnost, která zahrnuje required modifikátor.

Některé typy, například poziční záznamy, používají primární konstruktor k inicializaci pozičních vlastností. Pokud některé z těchto vlastností zahrnují required modifikátor, primární konstruktor přidá SetsRequiredMembers atribut. To znamená, že primární konstruktor inicializuje všechny požadované členy. Můžete napsat vlastní konstruktor s atributem System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute . Kompilátor ale neověřuje, že tyto konstruktory inicializují všechny požadované členy. Místo toho atribut tvrdí kompilátoru, že konstruktor inicializuje všechny požadované členy. Atribut SetsRequiredMembers přidá tato pravidla do konstruktorů:

  • Konstruktor, který je zřetězený k jinému konstruktoru anotovanému atributuSetsRequiredMembers, musí this()base()obsahovat SetsRequiredMembers také atribut. Tím zajistíte, aby volající mohli správně používat všechny příslušné konstruktory.
  • Konstruktory kopírování generované pro record typy mají SetsRequiredMembers atribut použitý, pokud některý z členů jsou required.

Upozorňující

Zakáže SetsRequiredMembers kontrolu kompilátoru, že se při vytvoření objektu inicializují všechny required členy. Používejte ho s opatrností.

Následující kód ukazuje hierarchii tříd, která používá required modifikátor pro vlastnosti FirstName a LastName vlastnosti:

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; }
}

Další informace o požadovaných členech najdete ve specifikaci funkce C#11 – Požadované členy .