Megosztás a következőn keresztül:


olvasható (C# referencia)

A readonly kulcsszó egy módosító, amely öt környezetben használható:

  • A meződeklarációkban azt jelzi, readonly hogy a mezőhöz való hozzárendelés csak a deklaráció részeként vagy ugyanabban az osztályban lévő konstruktorban történhet. Egy olvasható mező többször is hozzárendelhető és hozzárendelhető a meződeklarációban és a konstruktorban.

    A readonly konstruktor kilépése után nem lehet mezőt hozzárendelni. Ez a szabály különböző hatással van az értéktípusokra és a referenciatípusokra:

    • 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ó azonban nem akadályozza meg a mező példányadatainak módosítását az írásvédett mezőben.

    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 figyelmeztetést válthat ki a CA2104-ről : "Ne deklarálja az írásvédett hivatkozástípusokat".

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

  • Egy struktúratípuson belüli példánytag-deklaráció azt jelzi, readonly hogy egy példánytag nem módosítja a struktúra állapotát. További információ: a readonly Struktúratípusok cikk példánytagok szakasza.

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

Írásvédett mező példa

Ebben a példában a mező year értéke nem módosítható a metódusban ChangeYear, annak ellenére, hogy egy értéket rendelt hozzá az osztálykonstruktorhoz:

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:

  • Ha a változó inicializálva van a deklarációban, például:

    public readonly int y = 5;
    
  • A példány meződeklarációját tartalmazó osztály példánykonstruktorában.

  • 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.

Feljegyzés

A readonly kulcsszó eltér a const kulcsszótól. Egy const mező csak a mező deklarációjakor inicializálható. Egy readonly mező többször is hozzárendelhető a meződeklarációban és bármely konstruktorban. Ezért a readonly mezők a használt konstruktortól függően eltérő értékeket tartalmazhatnak. 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
    */
}

Az előző példában, ha az alábbihoz hasonló utasítást használ:

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)

Olvasható példányok tagjai

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

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

Feljegyzé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 elvégezhetik a számítást, és gyorsítótárazhatjá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, azzal garantálja, 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ákat a readonly Struktúratípusok cikk példánytagok szakaszában talál.

Példa visszaolvasása

A readonly módosító azt ref return jelzi, hogy a visszaadott hivatkozás nem módosítható. Az alábbi példa a forrásra mutató hivatkozást ad vissza. A módosító használatával jelzi, hogy a readonly 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 Minden olyan típus, amely visszaadható ref , visszaadható a következővel ref readonly: .

Példa írásvédett újrafedésre

A ref readonly return a példánytagokkal readonly is használható a következő típusok esetében struct :

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.

A nyelvi specifikációra vonatkozó javaslatok is megjelennek:

Lásd még