Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le modificateur required indique que le champ ou la propriété auquel il s'applique doit être initialisé par un initialisateur d'objet. Toute expression qui initialise 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 où les propriétés ou les champs doivent être correctement initialisés, mais encore autoriser l’initialisation à l’aide d’initialiseurs d’objets. Plusieurs règles garantissent ce comportement :
- Le modificateur
requiredpeut être appliqué aux champs et propriétés déclarées dansstruct, et aux typesclass, y compris les typesrecordetrecord struct. Le modificateurrequiredne peut pas être appliqué aux membres d’uneinterface. - Les implémentations d’interface explicites ne peuvent pas être marquées comme
required. Ils ne peuvent pas être définis dans les initialiseurs d’objets. - Les membres obligatoires doivent être initialisés, mais ils peuvent être initialisés à
nullSi le type est un type de référence non nullable, le compilateur émet un avertissement si vous initialisez le membre ànull. Le compilateur émet une erreur si le membre n’est pas initialisé du tout. - Les membres obligatoires doivent être au moins aussi visibles que le type qu'ils contiennent. Par exemple, une classe
publicne peut pas contenir un champrequiredqui estprotected. En outre, les propriétés requises doivent avoir des setters (setou des accesseursinit) qui sont au moins aussi visibles que leurs types contenants. Les membres qui ne sont pas accessibles 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
requireddéclaré dans la classe de base. Le masquage d’un membre requis empêche les appelants d’utiliser des initialiseurs d’objet pour ce membre. En outre, les types dérivés qui remplacent 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 modificateurrequiredlors de la substitution d’une propriété. - Un type avec n’importe quel membre
requiredpeut ne pas être utilisé comme argument de type lorsque le paramètre de type inclut la contraintenew(). Le compilateur ne peut pas appliquer que tous les membres requis sont initialisés dans le code générique. - Le modificateur
requiredn’est pas autorisé sur la déclaration pour les paramètres positionnels d’un enregistrement. Vous pouvez ajouter une déclaration explicite pour une propriété positionnelle qui inclut le modificateurrequired.
Certains types, tels que enregistrements positionnels, utilisent un constructeur principal pour 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. Cela indique que le constructeur principal initialise tous les membres requis. Vous pouvez écrire votre propre constructeur avec l’attribut System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute. Toutefois, le compilateur ne vérifie pas que ces constructeurs initialisent tous les membres requis. Au lieu de cela, l’attribut affirme au compilateur que le constructeur initialise tous les membres requis. L’attribut SetsRequiredMembers ajoute ces règles aux constructeurs :
- Un constructeur qui se chaîne à un autre constructeur annoté avec l’attribut
SetsRequiredMembers,this()oubase(), doit également inclure l’attributSetsRequiredMembers. Cela garantit que les appelants peuvent utiliser correctement tous les constructeurs appropriés. - Les constructeurs de copies générés pour les types
recordont l'attributSetsRequiredMembersappliqué si l'un des membres estrequired.
Avertissement
Le SetsRequiredMembers désactive les vérifications du compilateur que tous les membres required sont initialisés lors de la création d’un objet. Utilisez-le avec précaution.
Le code suivant montre une hiérarchie de classes qui utilise 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 sur les membres requis, consultez la spécification de la fonctionnalité C#11 - Membres obligatoires.