Delen via


alleen-lezen (C#-verwijzing)

Gebruik het readonly trefwoord als een wijzigingsfunctie in vijf contexten:

  • In een velddeclaratie kunt u alleen het veld toewijzen tijdens de declaratie readonly of in een constructor in dezelfde klasse. U kunt een alleen-lezen veld meerdere keren toewijzen en toewijzen binnen de velddeclaratie en constructor.

    U kunt geen veld toewijzen readonly nadat de constructor is voltooid. Deze regel is anders van invloed op 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. De readonly 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 bevat met het kenmerk Alleen-lezen dat een onveranderbaar verwijzingstype is, kan een beveiligingsprobleem zijn en kan waarschuwing CA2104 activeren: 'Declareer niet alleen-lezen onveranderbare verwijzingstypen'.

  • In een readonly struct typedefinitie readonly betekent dit dat het structuurtype onveranderbaar is. Zie de readonly sectie struct van het artikel Structuurtypen voor meer informatie.

  • In een exemplaarliddeclaratie binnen een structuurtype betekent readonly dit dat een exemplaarlid de status van de structuur niet wijzigt. Zie de sectie readonly instancemembers in het artikel Structuurtypen voor meer informatie.

  • In een ref readonly methode return geeft de readonly wijzigingsfunctie aan dat de methode een verwijzing retourneert en schrijfbewerkingen niet aan die verwijzing zijn toegestaan.

De C#-taalreferentiedocumenten beschrijven de meest recent uitgebrachte versie van de C#-taal. Het bevat ook de eerste documentatie voor functies in openbare previews voor de aanstaande taalrelease.

De documentatie identificeert alle functies die voor het eerst zijn geïntroduceerd in de laatste drie versies van de taal of in de huidige openbare previews.

Aanbeveling

Raadpleeg het artikel over de versiegeschiedenis van de C#-taal om te achterhalen wanneer een functie voor het eerst is geïntroduceerd in C#.

Voorbeeld van een alleen-lezen veld

In dit voorbeeld kunt u de waarde van het year veld in de ChangeYear methode niet wijzigen, ook al wijst de klasseconstructor er een waarde aan toe:

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 u de variabele in de declaratie initialiseert, 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 . U kunt alleen een const veld initialiseren bij de declaratie van het veld. U kunt een readonly veld meerdere keren toewijzen 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

Gebruik de readonly wijzigingsfunctie om aan te geven dat een exemplaarlid de status van een struct niet wijzigt.

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

Opmerking

Voor een eigenschap lezen/schrijven kunt u de readonly wijzigingsfunctie toevoegen aan de get toegangsfunctie. Sommige get accessors voeren een berekening uit en slaat het resultaat in de cache op, in plaats van simpelweg de waarde van een privéveld te retourneren. Door de readonly wijzigingsfunctie toe te voegen aan de get toegangsfunctie, garandeert u dat de get toegangsfunctie de interne status van het object niet wijzigt door een resultaat in de cache op te cachen.

Zie de sectie Leden van het readonly exemplaar van het artikel Structuurtypen voor meer voorbeelden.

Voorbeeld van alleen-lezen-terugkeer

Een 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 ref kan worden geretourneerd, kan ook worden geretourneerd door ref readonly.

Voorbeeld van alleen-lezen-verwijzing retourneren

U kunt ook een ref readonly return exemplaarleden readonly gebruiken 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;
    }
}

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.

Zie ook