Sdílet prostřednictvím


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

required Modifikátor označuje, že pole nebo vlastnost, na které se vztahuje, 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.

Referenční dokumentace jazyka C# dokumentuje naposledy vydané verze jazyka C#. Obsahuje také počáteční dokumentaci k funkcím ve verzi Public Preview pro nadcházející jazykovou verzi.

Dokumentace identifikuje všechny funkce, které byly poprvé představeny v posledních třech verzích jazyka nebo v aktuálních verzích Public Preview.

Návod

Informace o tom, kdy byla funkce poprvé představena v jazyce C#, najdete v článku o historii verzí jazyka C#.

Pomocí modifikátoru required můžou vývojáři vytvářet typy, ve kterých musí být vlastnosti nebo pole správně inicializovány, ale přesto umožňují inicializaci prostřednictvím inicializátorů objektů. Toto chování zajišťuje několik pravidel:

  • required Použijte modifikátor u polí a vlastností deklarovaných v struct typech a class typech, včetně record a record struct typů. Modifikátor nelze použít required u členů objektu interface.
  • Explicitní implementace rozhraní nelze označit jako required. Nemůžete je nastavit v inicializátorech objektů.
  • Musíte inicializovat požadované členy, ale můžete 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. Kód, který vytvoří instanci, nemůže nastavit členy, které nejsou přístupné.
  • 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 nelze použít s žádnými required členy 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.
  • Modifikátor v deklaraci nelze použít required pro poziční parametry záznamu. 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. Tento atribut označuje, ž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í

Atribut SetsRequiredMembers zakáže kontroly 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á 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.