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é vstruct
aclass
, včetně typůrecord
arecord struct
. Modifikátorrequired
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 nanull
. 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 obsahovatrequired
pole, které jeprotected
. Požadované vlastnosti navíc musí obsahovat settery (set
neboinit
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átorrequired
. Odvozený typ nemůže stavrequired
odebrat. Odvozené typy mohou při přepsání vlastnosti přidat modifikátorrequired
. - 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átorrequired
.
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()
, nebobase()
, musí také obsahovat atributSetsRequiredMembers
. 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ý atributSetsRequiredMembers
, 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.