readonly (C#-Referenz)readonly (C# Reference)

Das Schlüsselwort readonly ist ein Modifizierer, den Sie für Felder verwenden können.The readonly keyword is a modifier that you can use on fields. Wenn eine Felddeklaration einen readonly-Modifizierer enthält, können Zuweisungen an die Felder, die von der Deklaration eingeführt wurden, nur als Teil der Deklaration oder in einem Konstruktor in derselben Klasse auftreten.When a field declaration includes a readonly modifier, assignments to the fields introduced by the declaration can only occur as part of the declaration or in a constructor in the same class.

BeispielExample

In diesem Beispiel kann der Wert des Felds year nicht zur Methode ChangeYear geändert werden, obwohl ihm im Klassenkonstruktor ein Wert zugewiesen ist:In this example, the value of the field year cannot be changed in the method ChangeYear, even though it is assigned a value in the class constructor:

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

Sie können einem readonly-Feld nur in den folgenden Kontexten einen Wert zuweisen:You can assign a value to a readonly field only in the following contexts:

  • Wenn die Variable in der Deklaration initialisiert ist, z.B.:When the variable is initialized in the declaration, for example:

    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.For an instance field, in the instance constructors of the class that contains the field declaration, or for a static field, in the static constructor of the class that contains the field declaration. Hierbei handelt es sich auch um die einzigen Kontexte, in denen es gültig ist, ein readonly-Feld als out oder ref-Parameter zu übergeben.These are also the only contexts in which it is valid to pass a readonly field as an out or ref parameter.

Hinweis

Das Schlüsselwort readonly unterscheidet sich vom Schlüsselwort const.The readonly keyword is different from the const keyword. Ein const-Feld kann nur bei der Deklaration des Felds initialisiert werden.A const field can only be initialized at the declaration of the field. Ein readonly-Feld kann entweder bei der Deklaration oder in einem Konstruktor initialisiert werden.A readonly field can be initialized either at the declaration or in a constructor. Daher können readonly-Felder abhängig vom verwendeten Konstruktor über unterschiedliche Werte verfügen.Therefore, readonly fields can have different values depending on the constructor used. Außerdem ist ein const-Feld eine Kompilierzeitkonstante, während ein readonly-Feld wie im folgenden Beispiel für Laufzeitkonstanten verwendet werden kann:Also, while a const field is a compile-time constant, the readonly field can be used for runtime constants as in the following example:

public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;  

BeispielExample

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

Im vorherigen Beispiel, wenn Sie eine Anweisung wie folgt verwenden:In the preceding example, if you use a statement like this:

p2.y = 66; // Error

erhalten Sie die Compilerfehlermeldung:you will get the compiler error message:

The left-hand side of an assignment must be an l-value

Es handelt sich um den gleichen Fehler, den Sie erhalten, wenn Sie versuchen, einen Wert einer Konstanten zuzuweisen.which is the same error you get when you attempt to assign a value to a constant.

C#-ProgrammiersprachenspezifikationC# Language Specification

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

Siehe auchSee Also

C#-ReferenzC# Reference
C#-ProgrammierhandbuchC# Programming Guide
C#-SchlüsselwörterC# Keywords
ModifiziererModifiers
constconst
FelderFields