readonly (référence C#)

Le mot clé readonly est un modificateur que vous pouvez utiliser sur des champs. Lorsqu’une déclaration de champ inclut un modificateur readonly, les assignations aux champs introduites par la déclaration peuvent se produire uniquement dans le cadre de la déclaration ou dans un constructeur de la même classe.

Exemple

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 :

class Age
{
    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;  
    
  • Pour un champ d’instance, dans les constructeurs d’instance de la classe qui contient la déclaration de champ, ou pour un champ statique, dans le constructeur statique de la classe qui contient la déclaration de champ. Ce sont également les seuls contextes dans lesquels il est valide de passer un champ readonly comme paramètre out ou ref.

Note

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 initialisé dans la déclaration ou dans un constructeur. C'est pourquoi, les champs readonly peuvent avoir des valeurs différentes en fonction du constructeur utilisé. 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 :

public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;  

Exemple

public class ReadOnlyTest
{
   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={0}, y={1}, z={2}", p1.x, p1.y, p1.z);
      SampleClass p2 = new SampleClass();
      p2.x = 55;   // OK
      Console.WriteLine("p2: x={0}, y={1}, z={2}", p2.x, p2.y, 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 :

p2.y = 66; // Error

vous obtenez le message d’erreur du compilateur :

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.

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

Informations de référence sur C#
Guide de programmation C#
Mots clés C#
Modificateurs
const
Champs