Delen via


alleen-lezen (C#-verwijzing)

Het readonly trefwoord is een wijzigingsfunctie die kan worden gebruikt in vijf contexten:

  • In een velddeclaratiereadonly 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. 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 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'.

  • In een readonly struct typedefinitie readonly geeft u aan dat het structuurtype onveranderbaar is. Zie de readonly 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 het readonly exemplaar van het artikel Structuurtypen voor meer informatie.

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

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 structgeen . 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:

Zie ook