Freigeben über


readonly (C#-Referenz)

Verwenden Sie das readonly Schlüsselwort als Modifizierer in fünf Kontexten:

  • In einer Felddeklaration bedeutet dies, readonly dass Sie das Feld nur während der Deklaration oder in einem Konstruktor in derselben Klasse zuweisen können. Sie können ein readonly-Feld mehrmals innerhalb der Felddeklaration und des Konstruktors zuweisen und neu zuweisen.

    Sie können nach readonly Abschluss des Konstruktors kein Feld zuweisen. Diese Regel wirkt sich auf Wertetypen und Verweistypen unterschiedlich aus:

    • Da Werttypen ihre Daten direkt enthalten, ist ein Feld, das ein readonly Werttyp ist, unveränderlich.
    • Da Verweistypen einen Verweis auf ihre Daten enthalten, muss ein Feld, das ein readonly Bezugstyp ist, immer auf dasselbe Objekt verweisen. Dieses Objekt ist möglicherweise nicht unveränderlich. Der readonly Modifizierer verhindert, dass der Feldwert durch eine andere Instanz des Verweistyps ersetzt wird. Der Modifizierer verhindert jedoch nicht, dass die Instanzdaten des Felds über das schreibgeschützte Feld geändert werden.

    Warnung

    Ein extern sichtbarer Typ, der ein extern sichtbares schreibgeschütztes Feld enthält, bei dem es sich um einen änderbaren Verweistyp handelt, kann ein Sicherheitsrisiko darstellen und eine Warnung von CA2104 auslösen: "Schreibgeschützte schreibgeschützte veränderbare Verweistypen nicht deklarieren".

  • In einer readonly struct Typdefinition bedeutet dies, readonly dass der Strukturtyp unveränderlich ist. Weitere Informationen finden Sie im readonly Strukturabschnitt des Artikels "Strukturtypen ".

  • In einer Instanzmemmdeklaration innerhalb eines Strukturtyps bedeutet dies, readonly dass ein Instanzmemm den Status der Struktur nicht ändert. Weitere Informationen finden Sie im Abschnitt "Instanzenmitglieder" des Artikels "Strukturtypen".

  • In einer ref readonly Methodenrückgabe gibt der readonly Modifizierer an, dass die Methode einen Verweis zurückgibt und Schreibvorgänge für diesen Verweis nicht zulässig sind.

Die C#-Sprachreferenz dokumentiert die zuletzt veröffentlichte Version der C#-Sprache. Außerdem enthält sie eine erste Dokumentation zu Funktionen in der öffentlichen Vorschau für die kommende Sprachversion.

In der Dokumentation werden alle Features identifiziert, die in den letzten drei Versionen der Sprache oder in der aktuellen öffentlichen Vorschau eingeführt wurden.

Tipp

Informationen dazu, wann ein Feature erstmals in C# eingeführt wurde, finden Sie im Artikel zum Versionsverlauf der C#-Sprache.

Readonly-Feldbeispiel

In diesem Beispiel können Sie den Wert des year Felds in der ChangeYear Methode nicht ändern, obwohl ihm der Klassenkonstruktor einen Wert zuweist:

class Age
{
    private readonly int _year;
    Age(int year)
    {
        _year = year;
    }
    void ChangeYear()
    {
        //_year = 1967; // Compile error if uncommented.
    }
}

Sie können einem Feld nur in den folgenden Kontexten einen readonly Wert zuweisen:

  • Wenn Sie die Variable in der Deklaration initialisieren, z. B.:

    public readonly int y = 5;
    
  • In einem Instanzkonstruktor der Klasse, der die Instanzfelddeklaration enthält.

  • Im statischen Konstruktor der Klasse, die die statische Felddeklaration enthält.

Diese Konstruktorkontexte sind auch die einzigen Kontexte, in denen es gültig ist, ein readonly Feld als Out - oder Ref-Parameter zu übergeben.

Hinweis

Das readonly Schlüsselwort unterscheidet sich vom Schlüsselwort const . Sie können ein const Feld nur bei der Deklaration des Felds initialisieren. Sie können ein readonly Feld mehrmals in der Felddeklaration und in einem beliebigen Konstruktor zuweisen. readonly Daher können Felder je nach verwendetem Konstruktor unterschiedliche Werte aufweisen. Während ein const Feld eine Kompilierungszeitkonstante ist, kann das readonly Feld wie im folgenden Beispiel für Laufzeitkonstanten verwendet werden:

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
    */
}

Wenn Sie im vorherigen Beispiel eine Anweisung wie das folgende Beispiel verwenden:

p2.y = 66;        // Error

Sie erhalten die Compilerfehlermeldung:

Ein readonly-Feld kann nicht zugewiesen werden (außer in einem Konstruktor oder einem Variableninitialisierer)

Schreibgeschützte Instanzmember

Verwenden Sie den readonly Modifizierer, um zu deklarieren, dass ein Instanzmemm den Zustand einer Struktur nicht ändert.

public readonly double Sum()
{
    return X + Y;
}

Hinweis

Bei einer Lese-/Schreibeigenschaft können Sie dem Accessor den readonlyget Modifizierer hinzufügen. Einige get Accessoren führen eine Berechnung aus und speichern das Ergebnis zwischen, anstatt einfach den Wert eines privaten Felds zurückzugeben. Durch Hinzufügen des readonly Modifizierers zum get Accessor garantieren Sie, dass der get Accessor den internen Zustand des Objekts nicht ändert, indem Sie ein Ergebnis zwischenspeichern.

Weitere Beispiele finden Sie im readonly Abschnitt "Instanzenmmber " des Artikels "Strukturtypen ".

Beispiel für Ref readonly Rückgabe

Ein readonly Modifizierer für ein ref return Element gibt an, dass der zurückgegebene Verweis nicht geändert werden kann. Im folgenden Beispiel wird ein Verweis auf den Ursprung zurückgegeben. Er verwendet den readonly Modifizierer, um anzugeben, dass Aufrufer den Ursprung nicht ändern können:

private static readonly SamplePoint s_origin = new SamplePoint(0, 0, 0);
public static ref readonly SamplePoint Origin => ref s_origin;

Der zurückgegebene Typ muss kein readonly struct sein. Jeder Typ, der zurückgegeben werden kann, ref kann auch von ref readonly.

Readonly ref readonly return example

Sie können auch eine ref readonly return Instanzmember readonly für struct Typen verwenden:

public struct ReadonlyRefReadonlyExample
{
    private int _data;

    public readonly ref readonly int ReadonlyRefReadonly(ref int reference)
    {
        // _data = 1; // Compile error if uncommented.
        return ref reference;
    }
}

Die Methode gibt im Wesentlichen einen readonly-Verweis zusammen mit dem Instanzmitglied (in diesem Fall eine Methode) zurück, ohne Instanzfelder ändern zu können readonly.

C#-Sprachspezifikation

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die endgültige Quelle für C#-Syntax und -Verwendung.

Siehe auch