Mot init
clé (référence C#)
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 tant que fonctionnalité d’aperçu en C# 13. 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");
}
}
}
Important
Le field
mot clé est une fonctionnalité d’aperçu en C# 13. Vous devez utiliser .NET 9 et définir votre <LangVersion>
élément preview
dans votre fichier projet afin d’utiliser le field
mot clé contextuel.
Vous devez être prudent à l’aide de la field
fonctionnalité de mot clé dans une classe qui a un champ nommé field
. Le nouveau field
mot clé ombre un champ nommé field
dans l’étendue d’un accesseur de propriété. Vous pouvez modifier le nom de la field
variable ou utiliser le @
jeton pour référencer l’identificateur field
en tant que @field
. Pour plus d’informations, lisez la spécification de fonctionnalité pour le field
mot clé.
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.