readonly (référence C#)

Le readonly mot clé est un modificateur qui peut être utilisé dans quatre contextes :

  • Dans une déclaration de champ, readonly indique que l’affectation au champ ne peut se produire que dans le cadre de la déclaration ou dans un constructeur dans la même classe. Un champ en lecture seule peut être affecté et réaffecté plusieurs fois dans la déclaration de champ et le constructeur.

    Un readonly champ ne peut pas être affecté après la fermeture du constructeur. Cette règle a des implications différentes pour les types valeur et les types référence :

    • Étant donné que les types valeur contiennent directement leurs données, un champ qui est un readonly type valeur est immuable.
    • Étant donné que les types de référence contiennent une référence à leurs données, un champ qui est un type de référence readonly doit toujours faire référence au même objet. Cet objet n’est pas immuable. Le modificateur readonly empêche le champ d’être remplacé par une autre instance du type de référence. Toutefois, le modificateur n’empêche pas les données d’instance du champ d’être modifiées via le champ en lecture seule.

    Avertissement

    Un type visible en externe qui contient un champ en lecture seule visible externe qui est un type de référence mutable peut être une vulnérabilité de sécurité et peut déclencher l’avertissement CA2104 : « Ne déclarez pas les types de référence mutables en lecture seule ».

  • Dans une readonly struct définition de type, readonly indique que le type de structure est immuable. Pour plus d’informations, consultez la readonly section struct de l’article Types de structure .

  • Dans une déclaration de membre d’instance dans un type de structure, readonly indique qu’un membre d’instance ne modifie pas l’état de la structure. Pour plus d’informations, consultez la readonly section membres d’instance de l’article Types de structure .

  • Dans un ref readonly retour de méthode, le modificateur indique que la readonly méthode retourne une référence et les écritures ne sont pas autorisées à cette référence.

Exemple de champ en lecture seule

Dans cet exemple, la valeur du champ year ne peut pas être modifiée dans la méthode ChangeYear, même si elle est affectée à une valeur dans le constructeur de classe :

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

Vous pouvez affecter une valeur à un champ readonly uniquement dans les contextes suivants :

  • Lorsque la variable est initialisée dans la déclaration, par exemple :

    public readonly int y = 5;
    
  • Dans un constructeur d’instance de la classe qui contient la déclaration de champ d’instance.

  • Dans le constructeur statique de la classe qui contient la déclaration de champ statique.

Ces contextes de constructeur sont également les seuls contextes dans lesquels il est valide de passer un readonly champ en tant que paramètre out ou ref .

Notes

Le mot clé readonly est différent du mot clé const. Un champ const ne peut être initialisé qu'au moment de la déclaration du champ. Un champ readonly peut être assigné plusieurs fois dans la déclaration de champ et dans un constructeur. C'est pourquoi, les champs readonly peuvent avoir des valeurs différentes en fonction du constructeur utilisé. En outre, alors qu’un const champ est une constante au moment de la compilation, le readonly champ peut être utilisé pour les constantes au moment de l’exécution, comme dans l’exemple suivant :

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

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

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

    public static void Main()
    {
        SamplePoint p1 = new SamplePoint(11, 21, 32);   // OK
        Console.WriteLine($"p1: x={p1.x}, y={p1.y}, z={p1.z}");
        SamplePoint p2 = new SamplePoint();
        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 :

p2.y = 66;        // Error

Le message d’erreur du compilateur s’affiche :

Un champ en lecture seule ne peut pas être affecté (sauf dans un constructeur ou un initialiseur de variable)

Exemple de retour ref readonly

Le readonly modificateur d’un ref return indique que la référence retournée ne peut pas être modifiée. L’exemple suivant retourne une référence à l’origine. Il utilise le readonly modificateur pour indiquer que les appelants ne peuvent pas modifier l’origine :

private static readonly SamplePoint s_origin = new SamplePoint(0, 0, 0);
public static ref readonly SamplePoint Origin => ref s_origin;

Le type retourné ne doit pas nécessairement être un readonly struct. Tout type pouvant être retourné par ref peut être retourné par ref readonly.

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.

Vous pouvez également voir les propositions de spécification de langage :

Voir aussi