Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Het readonly trefwoord is een wijzigingsfunctie die kan worden gebruikt in vijf contexten:
In een velddeclaratie
readonlygeeft 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 herhaaldelijk worden herverdeeld binnen de velddeclaratie en constructor.Een
readonlyveld kan niet worden toegekend nadat de constructor is beëindigd. Deze regel heeft verschillende gevolgen voor waardetypen en verwijzingstypen:- Omdat waardetypen rechtstreeks hun gegevens bevatten, is een veld dat een
readonlywaardetype is onveranderbaar. - Omdat verwijzingstypen een verwijzing naar hun gegevens bevatten, moet een veld dat een
readonlyverwijzingstype is altijd naar hetzelfde object verwijzen. Dat object kan mogelijk niet onveranderbaar zijn. Dereadonlywijzigingsfunctie 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 alleen-lezen veld bevat dat een veranderbaar verwijzingstype is, kan een beveiligingsprobleem zijn en kan waarschuwing CA2104 activeren: 'Declareer geen alleen-lezen veranderbare referentietypen'.
- Omdat waardetypen rechtstreeks hun gegevens bevatten, is een veld dat een
In een
readonly structtypedefinitiereadonlygeeft u aan dat het structuurtype onveranderbaar is. Zie dereadonlysectie struct van het artikel Structuurtypen voor meer informatie.In een exemplaarliddeclaratie binnen een structuurtype
readonlygeeft u aan dat een exemplaarlid de status van de structuur niet wijzigt. Zie de sectiereadonlyinstancemembers in het artikel Structuurtypen voor meer informatie.In een
ref readonlymethode return geeft de modifier aan dat dereadonlymethode een verwijzing retourneert en schrijfbewerkingen niet zijn toegestaan voor die verwijzing.- Een parameter declareren
ref readonlyvoor 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 exemplaarveldeclaratie bevat.
In de statische constructor van de klasse waarin de declaratie van het statische veld staat.
Deze constructorcontexten zijn ook de enige contexten waarin het geldig is om een readonly veld door te geven als een out - of ref-parameter .
Opmerking
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. Daarom kunnen readonly 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 het volgende voorbeeld gebruikt:
p2.y = 66; // Error
u krijgt het foutbericht van de compiler:
Een readonly veld kan niet toegewezen worden (behalve in een constructor of bij een variabele-initialisatie)
Leden van een alleen-lezen exemplaar
U kunt de readonly modifier ook gebruiken om aan te geven dat een instantiëringslid de status van een struct niet wijzigt.
public readonly double Sum()
{
return X + Y;
}
Opmerking
In het geval van een lees/schrijf eigenschap, kunt u de readonly modifier toevoegen aan de get accessor. 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 readonly instantieleden van het artikel Structuurtypen.
Voorbeeld van alleen-lezen-terugkeer
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. Het gebruikt de readonly wijzigingsparameter 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 geen readonly struct te zijn. Elk type dat door ref kan worden geretourneerd, kan door ref readonly worden geretourneerd.
Voorbeeld van alleen-lezen-verwijzing retourneren
Een ref readonly return kan ook worden gebruikt met readonly instantieleden van 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;
}
}
In feite retourneert de methode een readonly-verwijzing, samen met het lid van de instantie, in dit geval een methode, dat readonly is en 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.