Sdílet prostřednictvím


readonly (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 ukončení konstruktoru nelze přiřadit readonly 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 typu readonly nemě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ý. 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í.

    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 : "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 strukturyv č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 případě návraturef readonly metody modifikátor readonly označuje, že metoda vrací odkaz a zápisy nejsou pro tento odkaz povoleny.

Příklad pole pouze 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é 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 při deklaraci pole. Pole readonly lze v deklaraci pole a v libovolném konstruktoru 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í

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 readonly přidat get 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. Přidání modifikátoru readonly do přístupového objektu get zaručuje, že get přístupový prvek neupravuje vnitřní stav objektu tím, že ukládá jakýkoli výsledek 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. Jakýkoliv typ, který může být vrácen ref, může být také vrácen ref readonly.

Příklad návratu readonly ref readonly

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 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#.

Můžete se také podívat na návrhy specifikace jazyka:

Viz také