readonly (Referencia de C#)

Actualización: noviembre 2007

La palabra clave readonly corresponde a un modificador que se puede utilizar en campos. Cuando una declaración de campo incluye un modificador readonly, las asignaciones a los campos que aparecen en la declaración sólo pueden tener lugar en la propia declaración o en un constructor de la misma clase.

Ejemplo

En este ejemplo, el valor del campo year no se puede cambiar en el método ChangeYear, aunque se asigne un valor en el constructor de clase:

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

Sólo se puede asignar un valor a un campo readonly en los siguientes contextos:

  • Cuando la variable se inicializa en la declaración, por ejemplo:

    public readonly int y = 5;
    
  • Para un campo de instancia, en los constructores de instancia de la clase que contiene la declaración de campo; para un campo estático, en el constructor estático de la clase que contiene la declaración de campo. Éstos son también los únicos contextos en los que es válido pasar un campo readonly como parámetro out o ref.

Nota:

La palabra clave readonly es diferente de la palabra clave const. Un campo const sólo puede inicializarse en la declaración del campo. Un campo readonly puede inicializarse en la declaración o en un constructor. Por lo tanto, los campos readonly pueden tener diferentes valores en función del constructor que se utilice. Además, mientras que un campo const es una constante en tiempo de compilación, el campo readonly puede utilizarse para constantes en tiempo de ejecución, como muestra el siguiente ejemplo:

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
*/

En el ejemplo anterior, si se utiliza una instrucción como:

p2.y = 66; // Error

se obtendrá el siguiente mensaje de error del compilador:

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

que es el mismo error que se obtiene al intentar asignar un valor a una constante.

Especificación del lenguaje C#

Para obtener más información, vea la siguiente sección de Especificación del lenguaje C#.

  • 10.4.2 Campos de sólo lectura

Vea también

Conceptos

Guía de programación de C#

Referencia

Palabras clave de C#

Modificadores (Referencia de C#)

const (Referencia de C#)

Campos (Guía de programación de C#)

Otros recursos

Referencia de C#