readonly – modifikátor (Referenční dokumentace jazyka C#)
Klíčové readonly
slovo je modifikátor, který lze použít v pěti kontextech:
V deklaraci pole označuje,
readonly
že přiřazení k poli může dojít pouze jako součást deklarace nebo v konstruktoru ve stejné třídě. Pole jen pro čtení lze přiřadit a znovu přiřadit vícekrát v rámci deklarace a konstruktoru pole.Po
readonly
ukončení konstruktoru nelze přiřadit pole. Toto pravidlo má různé důsledky pro typy hodnot a odkazové typy:- Vzhledem k tomu, že typy hodnot přímo obsahují data, je pole, které je
readonly
typ hodnoty neměnný. - Vzhledem k tomu, že odkazové typy obsahují odkaz na data, musí pole, které je referenčním typem
readonly
, vždy odkazovat na stejný objekt. Tento objekt nemusí být neměnný.readonly
Modifikátor zabraňuje nahrazení hodnoty pole jinou instancí referenčního typu. Modifikátor ale nezabrání úpravě dat instance pole prostřednictvím pole jen pro čtení.
Upozorňující
Externě viditelný typ, který obsahuje externě viditelné pole jen pro čtení, které je proměnlivým referenčním typem, může být ohrožení zabezpečení a může aktivovat upozornění CA2104 : "Neklamovat proměnlivé odkazové typy jen pro čtení".
- Vzhledem k tomu, že typy hodnot přímo obsahují data, je pole, které je
readonly struct
V definici typu označuje,readonly
že typ struktury je neměnný. Další informace naleznete vreadonly
části struktury v článku Typy struktur.V deklaraci člena instance v rámci typu struktury označuje,
readonly
že člen instance neupravuje stav struktury. Další informace naleznete vreadonly
části členy instance v článku Typy struktur.V návratu
ref readonly
metody modifikátor označuje,readonly
že metoda vrací odkaz a zápisy nejsou pro tento odkaz povoleny.- Deklarujte
ref readonly
parametr metodě.
- Deklarujte
Příklad pole jen pro čtení
V tomto příkladu nelze hodnotu pole year
v metodě ChangeYear
změnit, i když byla přiřazena hodnota v konstruktoru třídy:
class Age
{
private readonly int _year;
Age(int year)
{
_year = year;
}
void ChangeYear()
{
//_year = 1967; // Compile error if uncommented.
}
}
Hodnotu můžete přiřadit k readonly
poli pouze v následujících kontextech:
Když je proměnná inicializována v deklaraci, například:
public readonly int y = 5;
V konstruktoru instance třídy, která obsahuje deklaraci pole instance.
Ve statickém konstruktoru třídy, která obsahuje deklaraci statického pole.
Tyto kontexty konstruktoru jsou také jedinými kontexty, ve kterých je platné předat readonly
pole jako výstupní nebo ref parametr.
Poznámka:
Klíčové readonly
slovo se liší od klíčového slova const . Pole const
lze inicializovat pouze v deklaraci pole. Pole readonly
lze v deklaraci pole a v libovolném konstruktoru přiřadit vícekrát. readonly
Pole proto můžou mít různé hodnoty v závislosti na použitém konstruktoru. I když const
je pole konstantou kompilační doby, readonly
lze pole použít pro konstanty za běhu jako v následujícím příkladu:
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
*/
}
Pokud v předchozím příkladu použijete příkaz podobný tomuto příkladu:
p2.y = 66; // Error
zobrazí se chybová zpráva kompilátoru:
Pole jen pro čtení nelze přiřadit (s výjimkou konstruktoru nebo inicializátoru proměnných).
Členy instance Readonly
Modifikátor můžete také použít readonly
k deklaraci, že člen instance neupravuje stav struktury.
public readonly double Sum()
{
return X + Y;
}
Poznámka:
V případě vlastnosti pro čtení a zápis můžete do přístupového objektu get
přidat readonly
modifikátor. Některé get
přístupové objekty mohou provést výpočet a uložit výsledek do mezipaměti, nikoli jednoduše vrátit hodnotu soukromého pole. readonly
Přidání modifikátoru do přístupového objektu get
zaručuje, že get
přístup neupravuje vnitřní stav objektu uložením jakéhokoli výsledku do mezipaměti.
Další příklady najdete v readonly
části členové instance v článku Typy struktur.
Příklad návratu jen pro čtení
readonly
Modifikátor na značce ref return
označuje, že vrácený odkaz nelze upravit. Následující příklad vrátí odkaz na původ. Pomocí modifikátoru readonly
označuje, že volající nemůžou změnit původ:
private static readonly SamplePoint s_origin = new SamplePoint(0, 0, 0);
public static ref readonly SamplePoint Origin => ref s_origin;
Vrácený typ nemusí být .readonly struct
Libovolný typ, který ref
lze vrátit, může být vrácen .ref readonly
Příklad návratu jen pro čtení jen pro čtení
A ref readonly return
lze také použít se readonly
členy instance u struct
typů:
public struct ReadonlyRefReadonlyExample
{
private int _data;
public readonly ref readonly int ReadonlyRefReadonly(ref int reference)
{
// _data = 1; // Compile error if uncommented.
return ref reference;
}
}
Metoda v podstatě vrátí readonly
odkaz společně s členem instance (v tomto případě metodou) ( readonly
nelze upravit žádná pole instance).
specifikace jazyka C#
Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.
Můžete se také podívat na návrhy specifikace jazyka: