Comparteix via


readonly (referencia de C#)

Use la readonly palabra clave como modificador en cinco contextos:

  • En una declaración de campo, readonly significa que solo puede asignar el campo durante la declaración o en un constructor de la misma clase. Puede asignar y reasignar un campo de solo lectura varias veces dentro de la declaración de campo y el constructor.

    No se puede asignar un readonly campo una vez finalizado el constructor. Esta regla afecta a los tipos de valor y a los tipos de referencia de forma diferente:

    • Dado que los tipos de valor contienen directamente sus datos, un campo que es un readonly tipo de valor es inmutable.
    • Dado que los tipos de referencia contienen una referencia a sus datos, un campo que es un readonly tipo de referencia siempre debe hacer referencia al mismo objeto. Es posible que ese objeto no sea inmutable. El readonly modificador impide reemplazar el valor de campo por una instancia diferente del tipo de referencia. Sin embargo, el modificador no impide que los datos de instancia del campo se modifiquen a través del campo de solo lectura.

    Advertencia

    Un tipo visible externamente que contiene un campo de solo lectura visible externamente que es un tipo de referencia mutable podría ser una vulnerabilidad de seguridad y podría desencadenar la advertencia CA2104 : "No declarar tipos de referencia mutables de solo lectura".

  • En una readonly struct definición de tipo, readonly significa que el tipo de estructura es inmutable. Para obtener más información, consulte la readonly sección struct del artículo Tipos de estructura .

  • En una declaración de miembro de instancia dentro de un tipo de estructura, readonly significa que un miembro de instancia no modifica el estado de la estructura. Para obtener más información, consulte la readonly sección miembros de instancia del artículo Tipos de estructura .

  • En una ref readonly devolución de método, el readonly modificador indica que el método devuelve una referencia y las escrituras no se permiten a esa referencia.

La documentación de referencia del lenguaje C# cubre la versión más reciente publicada del lenguaje C#. También contiene documentación inicial sobre las características de las versiones preliminares públicas de la próxima versión del lenguaje.

La documentación identifica cualquier característica introducida por primera vez en las últimas tres versiones del idioma o en las versiones preliminares públicas actuales.

Sugerencia

Para buscar cuándo se introdujo por primera vez una característica en C#, consulte el artículo sobre el historial de versiones del lenguaje C#.

Ejemplo de campo de solo lectura

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

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

Puede asignar un valor a un readonly campo solo en los contextos siguientes:

  • Al inicializar la variable en la declaración, por ejemplo:

    public readonly int y = 5;
    
  • En un constructor de instancia de la clase que contiene la declaración de campo de instancia.

  • En el constructor estático de la clase que contiene la declaración de campo estático.

Estos contextos de constructor también son los únicos contextos en los que es válido pasar un readonly campo como parámetro out o ref .

Nota:

La readonly palabra clave es diferente de la palabra clave const . Solo puede inicializar un const campo en la declaración del campo. Puede asignar un readonly campo varias veces en la declaración de campo y en cualquier constructor. Por lo tanto, los readonly campos pueden tener valores diferentes en función del constructor usado. Además, mientras un const campo es una constante en tiempo de compilación, el readonly campo se puede usar para constantes en tiempo de ejecución como en el ejemplo siguiente:

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

En el ejemplo anterior, si usa una instrucción como en el ejemplo siguiente:

p2.y = 66;        // Error

Recibe el mensaje de error del compilador:

No se puede asignar un campo de solo lectura a (excepto en un constructor o un inicializador de variable).

Miembros de instancia readonly

Use el readonly modificador para declarar que un miembro de instancia no modifica el estado de una estructura.

public readonly double Sum()
{
    return X + Y;
}

Nota:

Para una propiedad de lectura y escritura, puede agregar el readonly modificador al descriptor de get acceso. Algunos get descriptores de acceso realizan un cálculo y almacenan en caché el resultado, en lugar de simplemente devolver el valor de un campo privado. Al agregar el readonly modificador al get descriptor de acceso, se garantiza que el get descriptor de acceso no modifica el estado interno del objeto almacenando en caché ningún resultado.

Para obtener más ejemplos, consulte la readonly sección miembros de instancia del artículo Tipos de estructura .

Ejemplo de devolución de referencia de solo lectura

Un readonly modificador en indica ref return que no se puede modificar la referencia devuelta. En el ejemplo siguiente se devuelve una referencia al origen. Usa el readonly modificador para indicar que los autores de llamadas no pueden modificar el origen:

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

El tipo devuelto no necesita ser un readonly struct. Cualquier tipo que ref pueda devolver también se puede devolver mediante ref readonly.

Ejemplo de devolución readonly ref readonly

También puede usar con ref readonly returnreadonly miembros de instancia en struct tipos:

public struct ReadonlyRefReadonlyExample
{
    private int _data;

    public readonly ref readonly int ReadonlyRefReadonly(ref int reference)
    {
        // _data = 1; // Compile error if uncommented.
        return ref reference;
    }
}

Básicamente, el método devuelve una referencia readonly junto con el miembro de instancia (en este caso, un método) que readonly no puede modificar ningún campo de instancia.

Especificación del lenguaje C#

Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es el origen definitivo de la sintaxis y el uso de C#.

Consulte también