Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
readonly Klíčové slovo použijte jako modifikátor v pěti kontextech:
V deklaraci pole znamená,
readonlyže pole můžete přiřadit pouze během deklarace nebo v konstruktoru ve stejné třídě. Pole jen pro čtení můžete přiřadit a znovu přiřadit vícekrát v rámci deklarace a konstruktoru pole.Po dokončení konstruktoru
readonlynelze přiřadit pole. Toto pravidlo ovlivňuje typy hodnot a odkazové typy odlišně:- Vzhledem k tomu, že typy hodnot přímo obsahují data, je pole typu
readonlyneměnným typem hodnoty. - 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ý.readonlyModifiká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í.
Výstraha
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 : "Nekažujte měnitelné odkazové typy jen pro čtení".
- Vzhledem k tomu, že typy hodnot přímo obsahují data, je pole typu
readonly structV definici typu znamená,readonlyže typ struktury je neměnný. Další informace naleznete vreadonlyčásti strukturyv článku Typy struktur .V deklaraci člena instance v rámci typu struktury znamená,
readonlyže člen instance nezmění stav struktury. Další informace naleznete vreadonlyčásti členy instance v článku Typy struktur .V návratu
ref readonlymetody modifikátor označuje,readonlyže metoda vrací odkaz a zápisy nejsou pro tento odkaz povoleny.- Deklarujte
ref readonlyparametr metodě.
- Deklarujte
Referenční dokumentace jazyka C# dokumentuje naposledy vydané verze jazyka C#. Obsahuje také počáteční dokumentaci k funkcím ve verzi Public Preview pro nadcházející jazykovou verzi.
Dokumentace identifikuje všechny funkce, které byly poprvé představeny v posledních třech verzích jazyka nebo v aktuálních verzích Public Preview.
Návod
Informace o tom, kdy byla funkce poprvé představena v jazyce C#, najdete v článku o historii verzí jazyka C#.
Příklad pole pouze pro čtení
V tomto příkladu nemůžete změnit hodnotu year pole v ChangeYear metodě, i když konstruktor třídy přiřadí hodnotu k této metodě:
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:
Při inicializaci proměnné v deklaraci, například:
public readonly int y = 5;V konstruktoru instance té 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 můžete inicializovat const pouze v deklaraci pole. Pole můžete v deklaraci pole a v libovolném konstruktoru readonly přiřadit vícekrát. Proto readonly pole mohou 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 pouze pro čtení
Pomocí modifikátoru readonly deklarujte, že člen instance neupravuje stav struktury.
public readonly double Sum()
{
return X + Y;
}
Poznámka:
U 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 provádějí výpočet a ukládají výsledek do mezipaměti místo toho, aby jednoduše vracely hodnotu soukromého pole. Přidáním readonly modifikátoru do přístupového objektu get zaručujete, ž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 může vrátit, může být vrácen ref readonlytaké .
Příklad návratu readonly ref readonly
U typů struct můžete také použít ref readonly return členy readonly instance:
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 spolu s členem instance (v tomto případě metodou), přičemž readonly nemůže měnit žádná pole instance.
Specifikace jazyka C#
Další informace najdete ve specifikaci jazyka C#. Specifikace jazyka je konečným zdrojem syntaxe a použití jazyka C#.