readonly (Riferimenti per C#)
La parola chiave readonly
è un modificatore che può essere usato in cinque contesti:
In una dichiarazione di campo
readonly
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 modificatorereadonly
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".
- Poiché i tipi valore contengono direttamente i rispettivi dati, un campo contenente un tipo valore
In una definizione del tipo
readonly struct
,readonly
indica che il tipo di struttura non è modificabile. Per altre informazioni, vedere la sezionereadonly
struct 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 sezionereadonly
membri dell'istanza dell'articolo Tipi di struttura.In una
ref readonly
restituzione del metodo, il modificatorereadonly
indica che il metodo restituisce un riferimento in cui non sono consentite le scritture.- Dichiarazione di un
ref readonly
parametro in un metodo.
- Dichiarazione di un
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 readonly
membri 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: