Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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
requiredlze aplikovat na typy pole a vlastnosti, deklarované vstructaclass, včetně typůrecordarecord struct. Modifikátorrequirednelze 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
publicnapříklad nemůže obsahovatrequiredpole, které jeprotected. Požadované vlastnosti navíc musí obsahovat settery (setneboinitpří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
requireddeklarované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 stavrequiredodebrat. Odvozené typy mohou při přepsání vlastnosti přidat modifikátorrequired. - Typ s libovolnými členy
requirednelze 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
requirednení 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
recordmají 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.