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 uniquement une méthode setter get 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.

Voir aussi