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.
Mot
Le mot clé init définit une méthode d’accesseur dans une propriété ou un indexeur. Un setter init-only affecte une valeur à la propriété ou à l’élément d’indexeur uniquement pendant la construction de l’objet. Un init applique l’immuabilité, de sorte qu’une fois l’objet initialisé, il ne peut pas être modifié. Un accesseur init permet d’appeler du code pour utiliser un initialiseur d’objet pour définir la valeur initiale. En revanche, une propriété implémentée automatiquement avec un get setter uniquement doit être initialisée en appelant un constructeur. Une propriété avec un accesseur private set peut être modifiée après la construction, mais uniquement dans la classe.
Le code suivant illustre un init accesseur dans une propriété implémentée automatiquement :
class Person_InitExampleAutoProperty
{
public int YearOfBirth { get; init; }
}
Vous devrez peut-être implémenter l’un des accesseurs pour fournir la validation des paramètres. Vous pouvez le faire à l’aide du field mot clé, introduit en C# 14. Le field mot clé accède au champ de stockage synthétisé du compilateur pour cette propriété. L’exemple suivant montre une propriété où l’accesseur init valide la plage du value paramètre. »
class Person_InitExampleFieldProperty
{
public int YearOfBirth
{
get;
init
{
field = (value <= DateTime.Now.Year)
? value
: throw new ArgumentOutOfRangeException(nameof(value), "Year of birth can't be in the future");
}
}
}
L’accesseur init peut être utilisé comme membre expression-bodied. Exemple :
class Person_InitExampleExpressionBodied
{
private int _yearOfBirth;
public int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
L’exemple suivant définit un accesseur get et un accesseur init pour une propriété nommée YearOfBirth. Il utilise un champ privé nommé _yearOfBirth pour stocker la valeur de la propriété.
class Person_InitExample
{
private int _yearOfBirth;
public int YearOfBirth
{
get { return _yearOfBirth; }
init { _yearOfBirth = value; }
}
}
Un accesseur init ne force pas les appelants à définir la propriété. Au lieu de cela, il permet aux appelants d’utiliser un initialiseur d’objet tout en interdisant les modifications ultérieures. Vous pouvez ajouter le modificateur required pour forcer les appelants à définir une propriété. L’exemple suivant montre une seule propriété init avec un type valeur pouvant accepter la valeur Null comme champ de stockage. Si un appelant n’initialise pas la YearOfBirth propriété, cette propriété a la valeur par défaut null :
class Person_InitExampleNullability
{
private int? _yearOfBirth;
public int? YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
Pour forcer les appelants à définir une valeur initiale non Null, vous ajoutez le modificateur required, comme illustré dans l’exemple suivant :
class Person_InitExampleNonNull
{
private int _yearOfBirth;
public required int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
L’exemple suivant montre la distinction entre un private set, en lecture seule et la propriété init. La version du jeu privé et la version en lecture seule exigent que les appelants utilisent le constructeur ajouté pour définir la propriété name. La version private set permet à une personne de modifier son nom après la construction de l’instance. La version init ne nécessite aucun constructeur. Les appelants peuvent initialiser les propriétés en utilisant un initialiseur d’objet :
class PersonPrivateSet
{
public string FirstName { get; private set; }
public string LastName { get; private set; }
public PersonPrivateSet(string first, string last) => (FirstName, LastName) = (first, last);
public void ChangeName(string first, string last) => (FirstName, LastName) = (first, last);
}
class PersonReadOnly
{
public string FirstName { get; }
public string LastName { get; }
public PersonReadOnly(string first, string last) => (FirstName, LastName) = (first, last);
}
class PersonInit
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
PersonPrivateSet personPrivateSet = new("Bill", "Gates");
PersonReadOnly personReadOnly = new("Bill", "Gates");
PersonInit personInit = new() { FirstName = "Bill", LastName = "Gates" };
spécification du langage C#
Pour plus d'informations, voir la spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.