readonly (C#-Referenz)
Bei dem readonly-Schlüsselwort handelt es sich um einen Modifizierer, der für Felder verwendet werden kann. Wenn eine Felddeklaration einen readonly-Modifizierer enthält, können Zuweisungen an die Felder, die durch die Deklaration eingeführt werden, nur als Teil der Deklaration oder in einem Konstruktor derselben Klasse erfolgen.
Beispiel
In diesem Beispiel kann der Wert des Felds year nicht mit der ChangeYear-Methode geändert werden, obwohl ihm im Klassenkonstruktor ein Wert zugewiesen wurde:
class Age
{
readonly int _year;
Age(int year)
{
_year = year;
}
void ChangeYear()
{
//_year = 1967; // Compile error if uncommented.
}
}
Einem readonly-Feld kann nur in den folgenden Fällen ein Wert zugewiesen werden:
Beim Initialisieren der Variablen in der Deklaration, z. B.:
public readonly int y = 5;
Für ein Instanzenfeld in den Instanzkonstruktoren der Klasse, die die Felddeklaration enthält, oder für ein statisches Feld im statischen Konstruktor der Klasse, die die Felddeklaration enthält. Hierbei handelt sich auch um die einzigen Fälle, in denen ein readonly-Feld als out-Parameter oder als ref-Parameter übergeben werden darf.
Tipp
Das readonly-Schlüsselwort unterscheidet sich vom const-Schlüsselwort. Ein const-Feld kann nur bei der Deklaration des Felds initialisiert werden. Ein readonly-Feld kann entweder bei der Deklaration oder in einem Konstruktor initialisiert werden. Daher können readonly-Felder abhängig vom verwendeten Konstruktor über unterschiedliche Werte verfügen. Außerdem ist ein const-Feld eine Kompilierzeitkonstante, während ein readonly-Feld für Laufzeitkonstanten verwendet werden kann. Siehe folgendes Beispiel:
public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;
public class ReadOnlyTest
{
class SampleClass
{
public int x;
// Initialize a readonly field
public readonly int y = 25;
public readonly int z;
public SampleClass()
{
// Initialize a readonly instance field
z = 24;
}
public SampleClass(int p1, int p2, int p3)
{
x = p1;
y = p2;
z = p3;
}
}
static void Main()
{
SampleClass p1 = new SampleClass(11, 21, 32); // OK
Console.WriteLine("p1: x={0}, y={1}, z={2}", p1.x, p1.y, p1.z);
SampleClass p2 = new SampleClass();
p2.x = 55; // OK
Console.WriteLine("p2: x={0}, y={1}, z={2}", p2.x, p2.y, p2.z);
}
}
/*
Output:
p1: x=11, y=21, z=32
p2: x=55, y=25, z=24
*/
Wenn Sie im voranstehenden Beispiel eine Anweisung wie diese verwenden:
p2.y = 66; // Error
wird folgende Compilerfehlermeldung angezeigt:
The left-hand side of an assignment must be an l-value
Hierbei handelt es sich um denselben Fehler, der beim Zuweisen eines Werts zu einer Konstante auftritt.
C#-Programmiersprachenspezifikation
Weitere Informationen finden Sie in der C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.
Siehe auch
Referenz
Felder (C#-Programmierhandbuch)