Sdílet prostřednictvím


Vyžadovaný modifikátor (Referenční dokumentace jazyka C#)

Modifikátor required označuje, že pole nebo vlastnost , na kterou se vztahuje, musí být inicializovány 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. Modifikátor required 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žňují inicializaci pomocí inicializátorů objektů. Toto chování zajišťuje několik pravidel:

  • Modifikátor required lze aplikovat na typy pole a vlastnosti, deklarované v structa class, včetně typů record a record struct. Modifikátor required nelze použít u členů 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 lze je inicializovat 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 public například nemůže obsahovat required pole, které je protected. Požadované vlastnosti navíc musí obsahovat settery (set nebo init přístupové metody), které jsou alespoň tak viditelné jako jejich obsahující typy. Členy, které nejsou přístupné, není možné nastavit pomocí kódu, který vytvoří instanci.
  • Odvozené třídy nemohou skrýt člena required deklarovaného v základní třídě. Skrytím požadovaného členu zabráníte volajícím použít inicializátory objektů. Kromě toho odvozené typy, které přepíší požadovanou vlastnost, musí obsahovat modifikátor required. Odvozený typ nemůže stav required odebrat. Odvozené typy mohou při přepsání vlastnosti přidat modifikátor required.
  • Typ s libovolnými členy required nelze použít jako argument typu, pokud parametr typu obsahuje omezení new(). Kompilátor nemůže vynutit inicializaci všech požadovaných členů v obecném kódu.
  • Modifikátor required není u deklarace pro poziční parametry záznamu povolen. Můžete přidat explicitní deklaraci pro poziční vlastnost, která zahrnuje modifikátor required.

Některé typy, jako 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í modifikátor required, primární konstruktor přidá atribut SetsRequiredMembers. 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ý s jiným konstruktorem anotovaným atributem SetsRequiredMembers, buď this(), nebo base(), musí také obsahovat atribut SetsRequiredMembers. Tím zajistíte, aby volající mohli správně používat všechny příslušné konstruktory.
  • Konstruktory kopírování generované pro typy record mají použitý atribut SetsRequiredMembers, pokud je některý z členů required.

Varování

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

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

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 povinných členech najdete v dokumentaci specifikace funkce C#11 – Požadované členy.