readonly (Referencia de C#)readonly (C# Reference)

La palabra clave readonly es un modificador que se puede usar en tres contextos:The readonly keyword is a modifier that can be used in three contexts:

  • En una declaración de campo, readonly indica que la asignación a un campo solo se puede producir como parte de la declaración o en un constructor de la misma clase.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.
  • En una definición de readonly struct, readonly indica que struct es inmutable.In a readonly struct definition, readonly indicates that the struct is immutable.
  • En una devolución del método ref readonly, el modificador readonly indica que el método devuelve una referencia y las operaciones de escritura no se permiten en esa referencia.In a ref readonly method return, the readonly modifier indicates that method returns a reference and writes are not allowed to that reference.

Los dos contextos finales se agregaron en C# 7.2.The final two contexts were added in C# 7.2.

Ejemplo de campo readonlyReadonly field example

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: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.
    }
}

Solo se puede asignar un valor a un campo readonly en los siguientes contextos:You can assign a value to a readonly field only in the following contexts:

  • Cuando la variable se inicializa en la declaración, por ejemplo:When the variable is initialized in the declaration, for example:
public readonly int y = 5;
  • En un constructor de instancia de la clase que contiene la declaración de campo de instancia.In an instance constructor of the class that contains the instance field declaration.
  • En el constructor estático de la clase que contiene la declaración de campo estático.In the static constructor of the class that contains the static field declaration.

Estos contextos de constructor son también los únicos en los que es válido pasar un campo readonly como parámetro out o 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.

Nota

La palabra clave readonly es diferente de la palabra clave const.The readonly keyword is different from the const keyword. Un campo const solo se puede inicializar en la declaración del campo.A const field can only be initialized at the declaration of the field. Un campo readonly se puede asignar varias veces en la declaración de campo y en cualquier constructor.A readonly field can be assigned multiple times in the field declaration and in any constructor. Por lo tanto, los campos readonly pueden tener diferentes valores en función del constructor que se use.Therefore, readonly fields can have different values depending on the constructor used. Además, mientras que un campo const es una constante en tiempo de compilación, el campo readonly puede usarse para constantes en tiempo de ejecución, como muestra el siguiente ejemplo: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;
    }

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

En el ejemplo anterior, si se usa una instrucción como el ejemplo siguiente:In the preceding example, if you use a statement like the following example:

p2.y = 66; // Error

se obtendrá el siguiente mensaje de error del compilador:you will get the compiler error message:

A readonly field cannot be assigned to (except in a constructor or a variable initializer)

Ejemplo de estructura de solo lecturaReadonly struct example

El modificador readonly en una definición struct declara que la estructura es inmutable.The readonly modifier on a struct definition declares that the struct is immutable. Todos los campos de instancia de struct se deben marcar como readonly, como se muestra en el ejemplo siguiente: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})";
}

En el ejemplo anterior se usan propiedades automáticas de solo lectura para declarar su almacenamiento.The preceding example uses readonly auto properties to declare its storage. Eso indica al compilador que cree campos de respaldo readonly para esas propiedades.That instructs the compiler to create readonly backing fields for those properties. También se podrían declarar campos readonly directamente: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})";
}

La adición de un campo no marcado readonly genera el error del compilador CS8340: "Los campos de instancia de las estructuras readonly deben ser readonly".Adding a field not marked readonly generates compiler error CS8340: "Instance fields of readonly structs must be readonly."

Ejemplo de devolución de Ref readonlyRef readonly return example

El modificador readonly en una ref return indica que la referencia devuelta no se puede modificar.The readonly modifier on a ref return indicates that the returned reference cannot be modified. En el ejemplo siguiente se devuelve una referencia al origen.The following example returns a reference to the origin. Usa el modificador readonly para indicar que los autores de la llamada no pueden modificar el origen: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;

No es necesario que el tipo devuelto sea una readonly struct.The type returned doesn't need to be a readonly struct. Cualquier tipo que ref pueda devolver ref readonly también puede devolver.Any type that can be returned by ref can be returned by ref readonly

Especificación del lenguaje C#C# language specification

Para obtener más información, consulte la Especificación del lenguaje C#.For more information, see the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee also