Megosztás:


olvasható (C#-referencia)

Használja a readonly kulcsszót módosítóként öt környezetben:

  • A meződeklarációban azt jelenti, readonly hogy a mezőt csak a deklaráció során vagy ugyanabban az osztályban lévő konstruktorban rendelheti hozzá. A meződeklarációban és a konstruktorban többször is hozzárendelhet és újra hozzárendelhet egy olvasható mezőt.

    A konstruktor befejeződése után nem rendelhet hozzá readonly mezőt. Ez a szabály eltérően befolyásolja az értéktípusokat és a referenciatípusokat:

    • Mivel az értéktípusok közvetlenül tartalmazzák az adataikat, az readonly érték típusú mezők nem módosíthatók.
    • Mivel a referenciatípusok az adataikra mutató hivatkozást tartalmaznak, a referenciatípusú readonly mezőknek mindig ugyanarra az objektumra kell hivatkozniuk. Lehet, hogy az objektum nem módosítható. A readonly módosító megakadályozza a mezőérték lecserélését a referenciatípus egy másik példányára. A módosító elem azonban nem akadályozza meg a mező példányadatainak módosítását az írásvédett mezőn keresztül.

    Figyelmeztetés

    Előfordulhat, hogy egy külsőleg látható írásvédett mezőt tartalmazó külsőleg látható írásvédett mező egy biztonsági rés lehet, és a CA2104 figyelmeztetést válthatja ki: "Ne deklarálja az írásvédett hivatkozástípusokat".

  • readonly struct A típusdefiníció azt jelenti, readonly hogy a struktúratípus nem módosítható. További információkért tekintse meg a readonlyStruktúratípusok cikk struktúra szakaszát.

  • Egy struktúratípuson belüli példánytag-deklaráció azt jelenti, readonly hogy a példánytagok nem módosítják a struktúra állapotát. További információkért lásd a readonly példánytagok szakaszt a Struktúratípusok cikkben.

  • ref readonly A metódusvisszajelzésben a readonly módosító azt jelzi, hogy a metódus egy hivatkozást ad vissza, és az írások nem engedélyezettek erre a hivatkozásra.

A C# nyelv referenciadokumentuma a C# nyelv legújabb kiadású verzióját ismerteti. Emellett a közelgő nyelvi kiadás nyilvános előzetes verziójú funkcióinak kezdeti dokumentációját is tartalmazza.

A dokumentáció azonosítja azokat a funkciókat, amelyeket először a nyelv utolsó három verziójában vagy az aktuális nyilvános előzetes verziókban vezetnek be.

Jótanács

Ha meg szeretné tudni, hogy mikor jelent meg először egy funkció a C#-ban, tekintse meg a C# nyelvi verzióelőzményeiről szóló cikket.

Írásvédett mező példa

Ebben a példában nem módosíthatja year a mező értékét a ChangeYear metódusban, annak ellenére, hogy az osztálykonstruktor hozzá rendel egy értéket:

class Age
{
    private readonly int _year;
    Age(int year)
    {
        _year = year;
    }
    void ChangeYear()
    {
        //_year = 1967; // Compile error if uncommented.
    }
}

Értéket csak a következő környezetekben rendelhet hozzá egy readonly mezőhöz:

  • Amikor inicializálja a változót a deklarációban, például:

    public readonly int y = 5;
    
  • Annak az osztálynak a példánykonstruktorában, amely tartalmazza a példány meződeklarációját.

  • A statikus meződeklarációt tartalmazó osztály statikus konstruktorában.

Ezek a konstruktorkörnyezetek az egyetlen olyan környezetek, amelyekben érvényes egy readonly mező átadása out vagy ref paraméterként.

Megjegyzés:

A readonly kulcsszó eltér a const kulcsszótól. Egy mezőt csak a mező deklarációjában inicializálhat const . A mezőket readonly többször is hozzárendelheti a meződeklarációban és bármely konstruktorban. Ezért readonly mezők a használt konstruktortól függően eltérő értékekkel rendelkezhetnek. Emellett, bár a const mező fordítási időállandó, a readonly mező futásidejű állandókhoz is használható, ahogyan az alábbi példában is látható:

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
    */
}

Ha a következő példához hasonló utasítást használja az előző példában:

p2.y = 66;        // Error

ekkor megjelenik a fordító hibaüzenete:

Írásvédett mező nem rendelhető hozzá (a konstruktor vagy a változó inicializáló kivételével)

Csak olvasható példánytagok

readonly A módosító használatával deklarálhatja, hogy egy példánytag nem módosítja a szerkezet állapotát.

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

Megjegyzés:

Olvasási/írási tulajdonság esetén hozzáadhatja a readonly módosítót a get tartozékhoz. Egyes get kiegészítők számítást végeznek, és gyorsítótárazják az eredményt ahelyett, hogy egyszerűen visszaadják a magánmező értékét. Ha hozzáadja a readonly módosítót a get tartozékhoz, garantálhatja, hogy a get tartozék nem módosítja az objektum belső állapotát az eredmény gyorsítótárazásával.

További példákért tekintse meg a readonlyStruktúratípusok cikk példánytagok szakaszát.

readonly referencia visszatérési példa

Egy readonly módosító ref return azt jelzi, hogy a visszaadott hivatkozás nem módosítható. Az alábbi példa a forrásra mutató hivatkozást ad vissza. A readonly módosítót használja annak jelzésére, hogy a hívók nem módosíthatják a forrást.

private static readonly SamplePoint s_origin = new SamplePoint(0, 0, 0);
public static ref readonly SamplePoint Origin => ref s_origin;

A visszaadott típusnak nem kell readonly struct lenni. A visszaadható típusokat ref a függvény is visszaadhatja ref readonly.

Olvasható hivatkozás írásvédett visszatérési példa

A példánytagokkal struct a következő típusokat readonly is használhatjaref readonly return:

public struct ReadonlyRefReadonlyExample
{
    private int _data;

    public readonly ref readonly int ReadonlyRefReadonly(ref int reference)
    {
        // _data = 1; // Compile error if uncommented.
        return ref reference;
    }
}

A metódus lényegében a példány tagjával (ebben az esetben egy metódussal) readonly együtt ad vissza egy readonly hivatkozást (amely nem tud módosítani egy példánymezőt sem).

C# nyelvspecifikáció

További információkért lásd a C# nyelvi specifikációját. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.

Lásd még