Const vs Readonly in C#: Worin liegt der Unterschied und wann verwendet man was?
\n\nJeder 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.
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\nWas ist const in C#?
\n\nConst 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,enumundnull. \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
newoder Referenztypen (außerstring) verwendet werden. \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\nWenn 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.
Was ist readonly in C#?
\n\nReadonly 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
newoder ein Methodenaufruf verwendet werden). \n - Wird nicht in den Code eingefügt – es ist ein normales Feld mit Schreibschutz. \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\nEin 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.
Vergleich von const und readonly: Unterschiedstabelle
\n\nUm den Stoff zu festigen, hier ein anschaulicher Vergleich:
\n\n| Kriterium | \nconst | \nreadonly | \n
|---|---|---|
| Berechnungszeitpunkt | \nKompilierung | \nAusführung (Laufzeit) | \n
| Datentypen | \nNur primitive Typen + string | \nAlle Typen | \n
| Statik | \nImplizit static | \nKann static oder instance sein | \n
| Änderbarkeit | \nNie | \nNur im Konstruktor | \n
| Zugriff | \nAls
BlogsBuchempfehlungenLesen Sie auch |