readonly (Riferimenti per C#)

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

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

    readonlyNon è possibile assegnare un campo dopo la chiusura del costruttore. Questa regola ha implicazioni diverse per i tipi di valore e i tipi di riferimento:

    • Poiché i tipi di valore contengono direttamente i rispettivi dati, un campo contenente un tipo di 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, L'oggetto non è modificabile. Il modificatore readonly impedisce che il campo venga sostituito da un'istanza diversa del tipo di riferimento. Tuttavia, il modificatore non impedisce la modifica dei dati dell'istanza del campo tramite il campo di sola lettura.

    Avviso

    Un tipo visibile esternamente che contiene un campo di sola lettura visibile esternamente che è un tipo di riferimento modificabile può essere una vulnerabilità di sicurezza e può generare un avviso CA2104 : "non dichiarare tipi di riferimento modificabili in sola lettura".

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

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

  • In un ref readonly metodo restituito, il readonly modificatore indica che il metodo restituisce un riferimento e le Scritture non sono consentite a tale riferimento.

I readonly struct ref readonly contesti e sono stati aggiunti in C# 7,2. readonly membri struct aggiunti in C# 8,0

Esempio di campo di sola lettura

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

class Age
{
    readonly int year;
    Age(int year)
    {
        this.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 è possibile passare un readonly campo 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 const campo è una costante in fase di compilazione, il readonly campo 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

verrà ricevuto il messaggio di errore del compilatore:

Non è possibile assegnare un campo di sola lettura a (tranne che in un costruttore o in un inizializzatore di variabile)

Esempio di restituzione riferimento di sola lettura

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

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

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

Specifiche del linguaggio C#

Per ulteriori 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 specifiche del linguaggio:

Vedere anche