Partager via


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 = (YearOfBirth <= 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.

Voir aussi