alleen-lezen (C#-verwijzing)
Het readonly
trefwoord is een wijzigingsfunctie die kan worden gebruikt in vijf contexten:
In een velddeclaratie
readonly
geeft u aan dat toewijzing aan het veld alleen kan optreden als onderdeel van de declaratie of in een constructor in dezelfde klasse. Een alleen-lezen veld kan meerdere keren worden toegewezen en opnieuw worden toegewezen binnen de velddeclaratie en constructor.Een
readonly
veld kan niet worden toegewezen nadat de constructor is afgesloten. Deze regel heeft verschillende gevolgen voor waardetypen en verwijzingstypen:- Omdat waardetypen rechtstreeks hun gegevens bevatten, is een veld dat een
readonly
waardetype is onveranderbaar. - Omdat verwijzingstypen een verwijzing naar hun gegevens bevatten, moet een veld dat een
readonly
verwijzingstype is altijd naar hetzelfde object verwijzen. Dat object kan mogelijk niet onveranderbaar zijn. Dereadonly
wijzigingsfunctie voorkomt dat de veldwaarde wordt vervangen door een ander exemplaar van het verwijzingstype. De wijzigingsfunctie voorkomt echter niet dat de instantiegegevens van het veld worden gewijzigd via het alleen-lezenveld.
Waarschuwing
Een extern zichtbaar type dat een extern zichtbaar veld met het kenmerk Alleen-lezen bevat dat een onveranderbaar verwijzingstype is, kan een beveiligingsprobleem zijn en kan waarschuwing CA2104 activeren: 'Declareer niet alleen-lezen onveranderbare referentietypen'.
- Omdat waardetypen rechtstreeks hun gegevens bevatten, is een veld dat een
In een
readonly struct
typedefinitiereadonly
geeft u aan dat het structuurtype onveranderbaar is. Zie dereadonly
sectie struct van het artikel Structuurtypen voor meer informatie.In een exemplaarliddeclaratie binnen een structuurtype
readonly
geeft u aan dat een exemplaarlid de status van de structuur niet wijzigt. Zie de sectie Leden van hetreadonly
exemplaar van het artikel Structuurtypen voor meer informatie.In een
ref readonly
methode return geeft de modifier aan dat dereadonly
methode een verwijzing retourneert en schrijfbewerkingen niet zijn toegestaan voor die verwijzing.- Een parameter declareren
ref readonly
voor een methode.
- Een parameter declareren
Voorbeeld van een alleen-lezen veld
In dit voorbeeld kan de waarde van het veld year
niet worden gewijzigd in de methode ChangeYear
, ook al is er een waarde toegewezen aan de klasseconstructor:
class Age
{
private readonly int _year;
Age(int year)
{
_year = year;
}
void ChangeYear()
{
//_year = 1967; // Compile error if uncommented.
}
}
U kunt een waarde alleen toewijzen aan een readonly
veld in de volgende contexten:
Wanneer de variabele wordt geïnitialiseerd in de declaratie, bijvoorbeeld:
public readonly int y = 5;
In een instantieconstructor van de klasse die de declaratie van het exemplaarveld bevat.
In de statische constructor van de klasse die de declaratie van het statische veld bevat.
Deze constructorcontexten zijn ook de enige contexten waarin het geldig is om een readonly
veld door te geven als een out - of ref-parameter .
Notitie
Het readonly
trefwoord verschilt van het const-trefwoord . Een const
veld kan alleen worden geïnitialiseerd bij de declaratie van het veld. Een readonly
veld kan meerdere keren worden toegewezen in de velddeclaratie en in elke constructor. readonly
Daarom kunnen velden verschillende waarden hebben, afhankelijk van de gebruikte constructor. Hoewel een const
veld een compilatieconstante is, kan het readonly
veld ook worden gebruikt voor runtimeconstanten, zoals in het volgende voorbeeld:
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
*/
}
Als u in het voorgaande voorbeeld een instructie zoals in het volgende voorbeeld gebruikt:
p2.y = 66; // Error
u krijgt het foutbericht van de compiler:
Een alleen-lezen veld kan niet worden toegewezen aan (behalve in een constructor of een variabele initializer)
Leden van een alleen-lezen exemplaar
U kunt de readonly
wijzigingsfunctie ook gebruiken om aan te geven dat een exemplaarlid de status van een struct niet wijzigt.
public readonly double Sum()
{
return X + Y;
}
Notitie
In het geval van een eigenschap lezen/schrijven kunt u de readonly
wijzigingsfunctie toevoegen aan de get
toegangsfunctie. Sommige get
accessors kunnen een berekening uitvoeren en het resultaat in de cache opslaan, in plaats van alleen de waarde van een privéveld te retourneren. Als u de readonly
wijzigingsfunctie toevoegt aan de get
toegangsfunctie, zorgt u ervoor dat de get
toegangsfunctie de interne status van het object niet wijzigt door een resultaat in de cache op te cachen.
Meer voorbeelden vindt u in de sectie Leden van het readonly
exemplaar van het artikel Structuurtypen.
Voorbeeld van alleen-lezen-retournering
De readonly
wijzigingsfunctie op een ref return
geeft aan dat de geretourneerde verwijzing niet kan worden gewijzigd. In het volgende voorbeeld wordt een verwijzing naar de oorsprong geretourneerd. De wijzigingsfunctie wordt gebruikt readonly
om aan te geven dat bellers de oorsprong niet kunnen wijzigen:
private static readonly SamplePoint s_origin = new SamplePoint(0, 0, 0);
public static ref readonly SamplePoint Origin => ref s_origin;
Het geretourneerde type hoeft readonly struct
geen . Elk type dat door kan worden geretourneerd ref
, kan worden geretourneerd door ref readonly
.
Voorbeeld van alleen-lezen-verwijzing retourneren
Een ref readonly return
kan ook worden gebruikt met readonly
exemplaarleden voor struct
typen:
public struct ReadonlyRefReadonlyExample
{
private int _data;
public readonly ref readonly int ReadonlyRefReadonly(ref int reference)
{
// _data = 1; // Compile error if uncommented.
return ref reference;
}
}
De methode retourneert in wezen een readonly
verwijzing samen met het exemplaarlid (in dit geval een methode) dat readonly
(geen exemplaarvelden kan wijzigen).
C#-taalspecificatie
Zie de C#-taalspecificatie voor meer informatie. De taalspecificatie is de definitieve bron voor de C#-syntaxis en het gebruik.
U kunt ook de voorstellen voor taalspecificatie bekijken: