readonly (Référence C#)

Mise à jour : novembre 2007

Le mot clé readonly est un modificateur que vous pouvez utiliser sur des champs. Lorsqu'une déclaration de champ comprend un modificateur readonly, les assignations aux champs introduites par la déclaration sont possibles 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, bien qu'une valeur lui soit assignée dans le constructeur de la classe :

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

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

  • Lorsque la variable est initialisée dans la déclaration. 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 les seuls contextes dans lesquels il est valide de passer un champ readonly en tant que paramètre out ou ref.

Remarque :

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

public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;
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 de compilation :

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

qui correspond à 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, consultez la section suivante dans Spécifications du langage C#.

  • 10.4.2 Champs readonly

Voir aussi

Concepts

Guide de programmation C#

Référence

Mots clés C#

Modificateurs (Référence C#)

const (Référence C#)

Champs (Guide de programmation C#)

Autres ressources

Référence C#