modificateur requis (référence C#)
Le modificateur required
indique que le champ ou la propriété auquel il est appliqué doit être initialisé par un initialiseur d’objet. Toute expression initialisant une nouvelle instance du type doit initialiser tous les membres requis. Le modificateur required
est disponible à partir de C# 11. Le modificateur required
permet aux développeurs de créer des types nécessitant l'initialisation correcte des propriétés ou des champs, tout en autorisant l’initialisation à l’aide d’initialiseurs d’objets. Plusieurs règles garantissent ce comportement :
- Le modificateur
required
peut être appliqué aux champs et propriétés définis dans les typesstruct
etclass
, y compris les typesrecord
etrecord struct
. Le modificateurrequired
ne peut pas être appliqué aux membres d’uninterface
. - Les implémentations d’interface explicites ne peuvent pas être marquées comme
required
. Elles ne peuvent pas être définies dans les initialiseurs d’objets. - Les membres requis doivent être initialisés, mais ils peuvent être initialisés en
null
. Si le type est un type référence non-nullable, le compilateur émet un avertissement dans le cas d’une initialisation du membre surnull
. Le compilateur émet une erreur si le membre n’est pas du tout initialisé. - Les membres requis doivent être au minimum aussi visibles que leur type de conteneur. Par exemple, une classe
public
ne peut pas contenir un champrequired
qui estprotected
. En outre, les propriétés requises doivent comporter des méthodes setters (accesseursset
ouinit
) au moins aussi visibles que leurs types de conteneur. Les membres inaccessibles ne peuvent pas être définis par le code qui crée une instance. - Les classes dérivées ne peuvent pas masquer un membre
required
défini dans la classe de base. Le masquage d’un membre requis empêche les appelants d’utiliser des initialiseurs d’objet pour celui-ci. En outre, les types dérivés remplaçant une propriété requise doivent inclure le modificateurrequired
. Le type dérivé ne peut pas supprimer l’étatrequired
. Les types dérivés peuvent ajouter le modificateurrequired
lors de la substitution d’une propriété. - Un type avec des membres
required
ne peut pas être utilisé comme argument de type lorsque le paramètre de type inclut la contraintenew()
. Le compilateur ne peut pas garantir l'initialisation de tous les membres requis dans le code générique. - Le modificateur
required
n’est pas autorisé dans la déclaration des paramètres positionnels d’un enregistrement. Vous pouvez ajouter une déclaration explicite pour une propriété positionnelle incluant le modificateurrequired
.
Certains types, tels que les enregistrements positionnels, utilisent un constructeur principal permettant d’initialiser les propriétés positionnelles. Si l’une de ces propriétés inclut le modificateur required
, le constructeur principal ajoute l’attribut SetsRequiredMembers
. Ceci indique l'initialisation de tous les membres requis par le constructeur primaire. Vous pouvez écrire votre propre constructeur avec l’attribut System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute. Toutefois, le compilateur ne vérifie pas l'initialisation de tous les membres requis par ces constructeurs. Au lieu de cela, l’attribut garantit au compilateur l'initialisation de tous les membres requis par le constructeur. L’attribut SetsRequiredMembers
ajoute ces règles aux constructeurs :
- Un constructeur relié à un autre constructeur annoté avec l’attribut
SetsRequiredMembers
,this()
oubase()
, doit également inclure l’attributSetsRequiredMembers
. Cela garantit l'utilisation correcte par les appelants de tous les constructeurs appropriés. - Les constructeurs de copie générés pour les types
record
comportent l’attributSetsRequiredMembers
appliqué si l’un des membres estrequired
.
Avertissement
Le SetsRequiredMembers
désactive les vérifications du compilateur indiquant l’initialisation de tous les membres required
lors de la création d’un objet. Utilisez-la avec précaution.
Le code suivant montre une hiérarchie de classes utilisant le modificateur required
pour les propriétés FirstName
et 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; }
}
Pour plus d’informations concernant les membres requis, consultez la spécification de la fonctionnalité C#11 - Membres obligatoires.