readonly (référence C#)readonly (C# Reference)

Le mot clé readonly est un modificateur qui peut être utilisé dans trois contextes :The readonly keyword is a modifier that can be used in three contexts:

  • Dans une déclaration de champ, readonly indique qu’une affectation à destination d’un champ peut survenir uniquement dans le cadre de la déclaration ou dans un constructeur de la même classe.In a field declaration, readonly indicates that assignment to the field can only occur as part of the declaration or in a constructor in the same class.
  • Dans une définition readonly struct, readonly indique que le struct est immuable.In a readonly struct definition, readonly indicates that the struct is immutable.
  • Dans un ref readonlyretour de la méthode, le modificateur readonly indique que la méthode retourne une référence et que les écritures ne sont pas autorisés pour cette référence.In a ref readonly method return, the readonly modifier indicates that method returns a reference and writes are not allowed to that reference.

Les deux contextes finaux ont été ajoutés dans C# 7.2.The final two contexts were added in C# 7.2.

Exemple de champ en lecture seuleReadonly field example

Dans cet exemple, la valeur du champ year ne peut pas être modifiée dans la méthode ChangeYear, même si une valeur lui est affectée dans le constructeur de classe :In this example, the value of the field year cannot be changed in the method ChangeYear, even though it is assigned a value in the class constructor:

class Age
{
    readonly int year;
    Age(int year)
    {
        this.year = year;
    }
    void ChangeYear()
    {
        //year = 1967; // Compile error if uncommented.
    }
}

Vous pouvez affecter une valeur à un champ readonly uniquement dans les contextes suivants :You can assign a value to a readonly field only in the following contexts:

  • Lorsque la variable est initialisée dans la déclaration, par exemple :When the variable is initialized in the declaration, for example:
public readonly int y = 5;  
  • Dans un constructeur d’instance de la classe qui contient la déclaration de champ d’instance.In an instance constructor of the class that contains the instance field declaration.
  • Dans le constructeur statique de la classe qui contient la déclaration de champ statique.In the static constructor of the class that contains the static field declaration.

Ces contextes de constructeur sont aussi les seuls contextes dans lesquels il est possible de passer un champ readonly comme paramètre out ou ref.These constructor contexts are also the only contexts in which it is valid to pass a readonly field as an out or ref parameter.

Note

Le mot clé readonly est différent du mot clé const.The readonly keyword is different from the const keyword. Un champ const ne peut être initialisé qu'au moment de la déclaration du champ.A const field can only be initialized at the declaration of the field. Un champ readonly peut être initialisé dans la déclaration ou dans un constructeur.A readonly field can be initialized either at the declaration or in a constructor. C'est pourquoi, les champs readonly peuvent avoir des valeurs différentes en fonction du constructeur utilisé.Therefore, readonly fields can have different values depending on the constructor used. De même, alors qu’un champ const est une constante au moment de la compilation, le champ readonly peut être utilisé pour des constantes au moment de l’exécution, comme dans l’exemple suivant :Also, while a const field is a compile-time constant, the readonly field can be used for runtime constants as in the following example:

public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;  
class SampleClass
{
    public int x;
    // Initialize a readonly field
    public readonly int y = 25;
    public readonly int z;

    public SampleClass()
    {
        // Initialize a readonly instance field
        z = 24;
    }

    public SampleClass(int p1, int p2, int p3)
    {
        x = p1;
        y = p2;
        z = p3;
    }

    static void Main()
    {
        SampleClass p1 = new SampleClass(11, 21, 32);   // OK
        Console.WriteLine($"p1: x={p1.x}, y={p1.y}, z={p1.z}");
        SampleClass p2 = new SampleClass();
        p2.x = 55;   // OK
        Console.WriteLine($"p2: x={p2.x}, y={p2.y}, z={p2.z}");
    }
    /*
     Output:
        p1: x=11, y=21, z=32
        p2: x=55, y=25, z=24
    */
}

Dans l’exemple précédent, si vous utilisez une instruction telle que dans l’exemple suivant :In the preceding example, if you use a statement like the following example:

p2.y = 66; // Error

vous obtenez le message d’erreur du compilateur :you will get the compiler error message:

The left-hand side of an assignment must be an l-value

qui est la même erreur que vous obtenez lorsque vous tentez d’assigner une valeur à une constante.which is the same error you get when you attempt to assign a value to a constant.

Exemple de struct readonlyReadonly struct example

Le modificateur readonly dans une définition struct déclare que le struct est immuable.The readonly modifier on a struct definition declares that the struct is immutable. Chaque champ d’instance du struct doit être marqué readonly, comme dans l’exemple suivant :Every instance field of the struct must be marked readonly, as shown in the following example:

public readonly struct Point
{
    public double X { get; }
    public double Y { get; }

    public Point(double x, double y) => (X, Y) = (x, y);

    public override string ToString() => $"({X}, {Y})";
}

L’exemple précédent utilise les propriétés automatiques readonly pour déclarer son stockage.The preceding example uses readonly auto properties to declare its storage. Il donne l’instruction au compilateur de créer des champs de stockage readonly pour ces propriétés.That instructs the compiler to create readonly backing fields for those properties. Vous pouvez aussi déclarer des champs readonly directement :You could also declare readonly fields directly:

public readonly struct Point
{
    public readonly double X;
    public readonly double Y;

    public Point(double x, double y) => (X, Y) = (x, y);

    public override string ToString() => $"({X}, {Y})";
}

L’ajout d’un champ non marqué readonly génère l’erreur CS8340 du compilateur : « Les champs d’instance de structs readonly doivent être en lecture seule ».Adding a field not marked readonly generates compiler error CS8340: "Instance fields of readonly structs must be readonly."

Exemple de retour ref readonlyRef readonly return example

Le modificateur readonly au niveau d’un ref return indique que la référence retournée ne peut pas être modifiée.The readonly modifier on a ref return indicates that the returned reference cannot be modified. L’exemple suivant retourne une référence à l’origine.The following example returns a reference to the origin. Il utilise le modificateur readonly pour indiquer que les appelants ne peuvent pas modifier l’origine :It uses the readonly modifier to indicate that callers cannot modify the origin:

private static readonly Point origin = new Point(0, 0);
public static ref readonly Point Origin => ref origin;

Le type retourné ne doit pas nécessairement être un readonly struct.The type returned doesn't need to be a readonly struct. Tout type pouvant être retourné par ref peut être retourné par ref readonly.Any type that can be returned by ref can be returned by ref readonly

Spécification du langage C#C# Language Specification

Pour plus d'informations, voir la spécification du langage C#.For more information, see the C# Language Specification. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.The language specification is the definitive source for C# syntax and usage.

Voir aussiSee Also

Référence C#C# Reference
Guide de programmation C#C# Programming Guide
Mots clés C#C# Keywords
ModificateursModifiers
constconst
ChampsFields