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ó. Areadonly
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".
- Mivel az értéktípusok közvetlenül tartalmazzák az adataikat, az
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 areadonly
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ó: areadonly
Struktúratípusok cikk példánytagok szakasza.ref readonly
A metódusvisszajelzésben a módosító azt jelzi, hogy areadonly
metódus hivatkozásokat ad vissza, és az írások nem engedélyezettek erre a hivatkozásra.- Paraméter metódusként való deklarálása.
ref readonly
- Paraméter metódusként való deklarálása.
Í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: