init (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.
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; }
}
}
Souvent, l’accesseur init
se compose d’une seule instruction qui assigne une valeur, comme dans l’exemple précédent. En raison de init
, ce qui suit ne fonctionne pas :
var john = new Person_InitExample
{
YearOfBirth = 1984
};
john.YearOfBirth = 1926; //Not allowed, as its value can only be set once in the constructor
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 propriété YearOfBirth
, cette propriété aura la valeur null
par défaut :
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’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’accesseur init
peut également être utilisé dans des propriétés implémentées automatiquement, comme le montre l’exemple de code suivant :
class Person_InitExampleAutoProperty
{
public int YearOfBirth { get; init; }
}
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.