Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Verwenden Sie das readonly Schlüsselwort als Modifizierer in fünf Kontexten:
In einer Felddeklaration bedeutet dies,
readonlydass 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
readonlyAbschluss 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
readonlyWerttyp ist, unveränderlich. - Da Verweistypen einen Verweis auf ihre Daten enthalten, muss ein Feld, das ein
readonlyBezugstyp ist, immer auf dasselbe Objekt verweisen. Dieses Objekt ist möglicherweise nicht unveränderlich. DerreadonlyModifizierer 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".
- Da Werttypen ihre Daten direkt enthalten, ist ein Feld, das ein
In einer
readonly structTypdefinition bedeutet dies,readonlydass der Strukturtyp unveränderlich ist. Weitere Informationen finden Sie imreadonlyStrukturabschnitt des Artikels "Strukturtypen ".In einer Instanzmemmdeklaration innerhalb eines Strukturtyps bedeutet dies,
readonlydass ein Instanzmemm den Status der Struktur nicht ändert. Weitere Informationen finden Sie im Abschnitt "Instanzenmitglieder" des Artikels "Strukturtypen".In einer
ref readonlyMethodenrückgabe gibt derreadonlyModifizierer an, dass die Methode einen Verweis zurückgibt und Schreibvorgänge für diesen Verweis nicht zulässig sind.- So deklarieren Sie einen
ref readonlyParameter für eine Methode.
- So deklarieren Sie einen
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.