Const vs Readonly in C#: Was wählen und worin liegt der Unterschied?

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Const vs Readonly in C#: Worin liegt der Unterschied und wann verwendet man was?

\n\n

Jeder C#-Entwickler steht früher oder später vor dem Dilemma: Soll ein Wert als const oder als readonly deklariert werden? Auf den ersten Blick bewirken beide Schlüsselwörter dasselbe – sie verhindern eine Änderung der Variable nach der Initialisierung. Aber gräbt man tiefer, offenbart sich eine ganze Kluft von Unterschieden, die sich auf die Architektur, Leistung und sogar die Codesicherheit auswirken.

\n\n

In diesem Artikel listen wir nicht nur trockene Fakten aus der Dokumentation auf. Wir analysieren reale Szenarien, zeigen Fallstricke auf und helfen Ihnen, eine fundierte Entscheidung zu treffen. Los geht's!

\n\n

Was ist const in C#?

\n\n

Const ist eine Kompilierzeitkonstante. Ihr Wert muss zum Zeitpunkt der Kompilierung bekannt sein und kann sich zur Laufzeit nicht ändern.

\n\n
    \n
  • Kann nur primitive Typen sein: int, double, string, bool, enum und null.
  • \n
  • Implizit static – gehört zum Typ, nicht zur Instanz.
  • \n
  • Der Wert wird direkt in den Code zur Kompilierzeit eingefügt (wie ein Makro in C++).
  • \n
  • Kann nicht mit new oder Referenztypen (außer string) verwendet werden.
  • \n
\n\n
public class MathConstants\n{\n    public const double Pi = 3.14159;\n    public const int MaxRetries = 5;\n    public const string AppName = "MyApp";\n    \n    // Fehler! Referenztypen (außer string) sind nicht erlaubt\n    // public const List<int> Numbers = new List<int>();\n}
\n\n

Wenn der Compiler auf const trifft, bettet er den Wert buchstäblich in den IL-Code ein. Das bedeutet, wenn Sie eine Konstante aus einer anderen Assembly verwenden und später ihren Wert ändern, verwenden die alten Assemblys weiterhin den alten Wert – bis sie neu kompiliert werden.

\n\n

Was ist readonly in C#?

\n\n

Readonly ist ein Feld, das nur zum Zeitpunkt der Deklaration oder im Konstruktor der Klasse initialisiert werden kann. Danach kann es nicht mehr geändert werden.

\n\n
    \n
  • Kann von jedem Typ sein: sowohl Wert- als auch Referenztyp.
  • \n
  • Kann sowohl statisch als auch instanzgebunden sein.
  • \n
  • Der Wert wird zur Laufzeit berechnet (z. B. kann new oder ein Methodenaufruf verwendet werden).
  • \n
  • Wird nicht in den Code eingefügt – es ist ein normales Feld mit Schreibschutz.
  • \n
\n\n
public class Config\n{\n    public readonly DateTime CreatedAt = DateTime.Now;\n    public readonly List<string> Tags;\n    public static readonly Guid InstanceId = Guid.NewGuid();\n    \n    public Config()\n    {\n        Tags = new List<string> { "csharp", "tutorial" };\n        // Fehler! Kann nach dem Konstruktor nicht geändert werden\n        // Tags = new List<string>();\n    }\n}
\n\n

Ein wichtiger Punkt: readonly schützt nur die Referenz, nicht den Inhalt des Objekts. Wenn Sie ein readonly List<int> haben, können Sie keine neue Liste zuweisen, aber problemlos Elemente hinzufügen oder entfernen.

\n\n

Vergleich von const und readonly: Unterschiedstabelle

\n\n

Um den Stoff zu festigen, hier ein anschaulicher Vergleich:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Kriteriumconstreadonly
BerechnungszeitpunktKompilierungAusführung (Laufzeit)
DatentypenNur primitive Typen + stringAlle Typen
StatikImplizit staticKann static oder instance sein
ÄnderbarkeitNieNur im Konstruktor
ZugriffAls

Blogs

Buchempfehlungen