const
und readonly
sind ähnlich, aber sie sind nicht genau das Gleiche.
Ein const
Feld ist eine Kompilierungszeitkonstante, was bedeutet, dass der Wert zur Kompilierungszeit berechnet werden kann. Ein readonly
Feld ermöglicht zusätzliche Szenarien, bei denen bestimmter Code während der Konstruktion des Typs ausgeführt werden muss. Nach der Konstruktion kann ein readonly
Feld nicht geändert werden.
Zum Beispiel können const
Elemente verwendet werden, um Elemente wie:
struct Test
{
public const double Pi = 3.14;
public const int Zero = 0;
}
Da Werte wie 3.14 und 0 Kompilierungszeitkonstanten sind. Allerdings, überlegen Sie sich den Fall, in dem Sie einen Typ definieren und einige vorgefertigte Instanzen davon bereitstellen möchten. Zum Beispiel könnte man eine Color-Klasse definieren und "Konstanten" für gebräuchliche Farben wie Schwarz, Weiß usw. bereitstellen. Dies ist mit const Elementen nicht möglich, da die rechten Seiten keine Kompilierungszeitkonstanten sind. Dies könnte mit regulären statischen Elementen gemacht werden:
public class Color
{
public static Color Black = new Color(0, 0, 0);
public static Color White = new Color(255, 255, 255);
public static Color Red = new Color(255, 0, 0);
public static Color Green = new Color(0, 255, 0);
public static Color Blue = new Color(0, 0, 255);
private byte red, green, blue;
public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}
Aber dann gibt es nichts, das einen Client von Color daran hindert, damit herumzuspielen, vielleicht indem er die Werte für Schwarz und Weiß vertauscht. Unnötig zu sagen, dies würde für andere Clients der Color-Klasse Ärger verursachen. Das "readonly"-Feature behandelt dieses Szenario.
Indem wir einfach das readonly
Schlüsselwort in den Deklarationen einführen, bewahren wir die flexible Initialisierung und verhindern, dass der Clientcode damit herumspielt.
public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
public static readonly Color Red = new Color(255, 0, 0);
public static readonly Color Green = new Color(0, 255, 0);
public static readonly Color Blue = new Color(0, 0, 255);
private byte red, green, blue;
public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}
Es ist interessant festzustellen, dass const Elemente immer statisch sind, während ein readonly Element entweder statisch oder nicht sein kann, genauso wie ein reguläres Feld.
Es ist möglich, ein einzelnes Schlüsselwort für diese beiden Zwecke zu verwenden, aber dies führt entweder zu Versionsproblemen oder Leistungsproblemen. Nehmen wir einmal an, dass wir für dies ein einzelnes Schlüsselwort (const) verwenden und ein Entwickler schreibt:
public class A
{
public static const C = 0;
}
Und ein anderer Entwickler schreibt Code, der auf A beruht:
public class B
{
static void Main() => Console.WriteLine(A.C);
}
Kann der generierte Code darauf vertrauen, dass A.C eine Kompilierungszeitkonstante ist? D.h., kann die Verwendung von A.C einfach durch den Wert 0 ersetzt werden? Wenn Sie darauf "ja" sagen, dann bedeutet das, dass der Entwickler von A die Art und Weise, wie A.C initialisiert wird, nicht ändern kann -- dies bindet die Hände des Entwicklers von A ohne Erlaubnis.
Wenn Sie darauf "nein" sagen, dann wird eine wichtige Optimierung verpasst. Vielleicht ist der Autor von A sicher, dass A.C immer Null sein wird. Die Verwendung von sowohl const als auch readonly erlaubt es dem Entwickler von A, die Absicht anzugeben. Dies führt zu einem besseren Versionsverhalten und auch zu einer besseren Leistung.
8 Stimmen
Hier ist ein sehr interessanter Einzelfall, den ich gerade zugunsten von
static readonly
gefunden habe: Versuchen Sie, ein const innerhalb einesIEnumerator
zu verwenden, das ein unerreichbaresyield
auslösen würde, und Sie erhalten einen gefürchteten "Interner Compilerfehler". Ich habe den Code nicht außerhalb von Unity3D getestet, aber ich vertraue darauf, dass dies entweder ein Mono oder ein .NET Fehler ist. Es handelt sich jedoch um ein C# Problem.4 Stimmen
Mögliche Duplikat von Was ist der Unterschied zwischen const und readonly?
10 Stimmen
Eine weitere Unterschied besteht darin, dass Sie eine const-Zeichenfolge in einem Switch verwenden können, aber keine static readonly-Zeichenfolge.
9 Stimmen
static readonly
kann in derswitch-case
-Anweisung alscase
-Variable nicht verwendet werden,const
ist für diesen Zweck erforderlich.4 Stimmen
static readonly
kann auch nicht als Attributparameter verwendet werden0 Stimmen
Für vollständige Details enlear.academy/…