Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Használja a readonly kulcsszót módosítóként öt környezetben:
A meződeklarációban azt jelenti,
readonlyhogy 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á
readonlymező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ú
readonlymezőknek mindig ugyanarra az objektumra kell hivatkozniuk. Lehet, hogy az objektum nem módosítható. Areadonlymó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".
- Mivel az értéktípusok közvetlenül tartalmazzák az adataikat, az
readonly structA típusdefiníció azt jelenti,readonlyhogy a struktúratípus nem módosítható. További információkért tekintse meg areadonlyStruktúratípusok cikk struktúra szakaszát.Egy struktúratípuson belüli példánytag-deklaráció azt jelenti,
readonlyhogy a példánytagok nem módosítják a struktúra állapotát. További információkért lásd areadonlypéldánytagok szakaszt a Struktúratípusok cikkben.ref readonlyA metódusvisszajelzésben areadonlymódosító azt jelzi, hogy a metódus egy hivatkozást 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
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.