Sdílet prostřednictvím


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í".

  • readonly struct V definici typu označuje, readonly že typ struktury je neměnný. Další informace naleznete v readonly čá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 v readonly čá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.

Příklad pole jen pro čtení

V tomto příkladu nelze hodnotu pole year v metodě ChangeYearzmě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:

Viz také