readonly (Riferimenti per C#)

La parola chiave readonly è un modificatore che può essere usato in cinque contesti:

  • In una dichiarazione di camporeadonly indica che l'assegnazione al campo può avvenire solo come parte della dichiarazione del campo o in un costruttore della stessa classe. Un campo readonly può essere assegnato e riassegnato più volte nella dichiarazione del campo e nel costruttore.

    Un campo readonly non può essere assegnato dopo aver chiuso il costruttore. Questa regola ha implicazioni diverse per i tipi valore e i tipi riferimento:

    • Poiché i tipi valore contengono direttamente i rispettivi dati, un campo contenente un tipo valore readonly non è modificabile.
    • Poiché i tipi di riferimento contengono un riferimento ai rispettivi dati, un campo contenente un tipo di riferimento readonly deve sempre fare riferimento allo stesso oggetto, Tale oggetto potrebbe non essere modificabile. Il modificatore readonly impedisce la sostituzione del valore del campo con un'istanza diversa del tipo riferimento. Il modificatore non impedisce tuttavia che i dati dell'istanza del campo vengano modificati mediante il campo di sola lettura.

    Avviso

    Un tipo visibile esternamente che contiene un campo di sola lettura visibile esternamente, ovvero un tipo riferimento modificabile, può costituire una vulnerabilità di sicurezza e attivare l'avviso CA2104 : "Non dichiarare tipi riferimento modificabili di sola lettura".

  • In una definizione del tipo readonly struct, readonly indica che il tipo di struttura non è modificabile. Per altre informazioni, vedere la sezione readonlystruct dell'articolo Tipi di strutture .

  • In una dichiarazione del membro dell'istanza all'interno di un tipo di struttura, readonly indica che un membro dell'istanza non modifica lo stato della struttura. Per altre informazioni, vedere la sezione readonlymembri dell'istanza dell'articolo Tipi di struttura.

  • In una ref readonlyrestituzione del metodo, il modificatore readonly indica che il metodo restituisce un riferimento in cui non sono consentite le scritture.

Esempio di campo di sola lettura

In questo esempio, il valore del campo year non può essere modificato nel metodo ChangeYear, anche se gli è stato assegnato un valore nel costruttore della classe:

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

È possibile assegnare un valore a un campo readonly solo nei contesti seguenti:

  • Quando la variabile viene inizializzata nella dichiarazione, ad esempio:

    public readonly int y = 5;
    
  • In un costruttore di istanze della classe che contiene la dichiarazione del campo di istanza.

  • Nel costruttore statico della classe che contiene la dichiarazione del campo statico.

Questi contesti del costruttore sono anche gli unici contesti in cui è valido passare un camporeadonly come parametro out o ref.

Nota

La parola chiave readonly è diversa dalla parola chiave const. Un campo const può essere inizializzato solo nella dichiarazione del campo. Un campo readonly può essere assegnato più volte nella dichiarazione del campo e in qualsiasi costruttore. I campi readonly possono quindi presentare valori diversi a seconda del costruttore usato. Inoltre, mentre un campo const rappresenta una costante in fase di compilazione, il campo readonly può essere usato per le costanti in fase di esecuzione, come nell'esempio seguente:

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

Nell'esempio precedente, se si usa un'istruzione simile all'esempio seguente:

p2.y = 66;        // Error

si ottiene il messaggio di errore del compilatore seguente:

Impossibile effettuare un'assegnazione a un campo di sola lettura (tranne che in un costruttore o in un inizializzatore di variabile)

Membri di istanza di sola lettura

È anche possibile usare il modificatore readonly per dichiarare che un membro di istanza non modifica lo stato di uno struct.

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

Nota

Nel caso di una proprietà di lettura/scrittura, è possibile aggiungere il modificatore readonly alla funzione di accesso get. Alcune funzioni di accesso get possono eseguire un calcolo e memorizzare nella cache il risultato, anziché restituire semplicemente il valore di un campo privato. L'aggiunta del modificatore readonly alla funzione di accesso get garantisce che la funzione di accesso get non modifichi lo stato interno dell'oggetto memorizzando nella cache i risultati.

Per altri esempi, vedere la sezione readonlymembri dell'istanza dell'articolo Tipi di struttura.

Esempio di restituzione riferimento di sola lettura

Il modificatore readonly in un ref return indica che il riferimento restituito non può essere modificato. L'esempio seguente restituisce un riferimento all'origine. Usa il modificatore readonly per indicare che i chiamanti non possono modificare l'origine:

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

Il tipo restituito può non essere readonly struct. Qualsiasi tipo che può essere restituito da ref può essere restituito anche da ref readonly.

Esempio di restituzione readonly ref readonly

Un ref readonly return può essere usato anche con i membri dell'istanza readonly nei tipi struct:

public struct ReadonlyRefReadonlyExample
{
    private int _data;

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

Il metodo restituisce essenzialmente un riferimento readonly insieme al membro dell'istanza (in questo caso un metodo), poiché readonly non è in grado di modificare i campi dell'istanza.

Specifiche del linguaggio C#

Per altre informazioni, vedere la specifica del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.

È anche possibile visualizzare le proposte relative alle specifiche del linguaggio:

Vedi anche