Was ist in C # der Unterschied zwischen
static readonly string MyStr;
und
const string MyStr;
?
Was ist in C # der Unterschied zwischen
static readonly string MyStr;
und
const string MyStr;
?
Antworten:
Wenn Sie eine constZeichenfolge verwenden, bettet der Compiler den Wert der Zeichenfolge zur Kompilierungszeit ein .
Wenn Sie einen constWert in einer anderen Assembly verwenden, dann die ursprüngliche Assembly aktualisieren und den Wert ändern, wird die Änderung der anderen Assembly erst angezeigt , wenn Sie sie neu kompilieren .
Ein static readonlyString ist ein normales Feld, das zur Laufzeit nachgeschlagen wird. Wenn daher der Wert des Felds in einer anderen Assembly geändert wird, werden die Änderungen angezeigt, sobald die Assembly geladen wird, ohne dass eine Neukompilierung erforderlich ist.
Dies bedeutet auch, dass eine static readonlyZeichenfolge nicht konstante Elemente wie Environment.UserNameoder verwenden kann DateTime.Now.ToString(). Eine constZeichenfolge kann nur mit anderen Konstanten oder Literalen initialisiert werden.
Außerdem kann eine static readonlyZeichenfolge in einem statischen Konstruktor festgelegt werden. Eine constZeichenfolge kann nur inline initialisiert werden.
Beachten Sie, dass a static stringgeändert werden kann; Sie sollten static readonlystattdessen verwenden.
constnur für Konstanten verwendet werden soll - die Werte der Konstanten sind , die nie , nie , nie ändern.
private constfür Werte verwende, die streng genommen keine Konstanten sind. Im Grunde ist es Missbrauch constfür Mikrooptimierungszwecke. Ich werde zu meiner Aussage "niemals, niemals, niemals" stehen , auch wenn sie mich zu einem Heuchler macht. ;)
Hier ist eine gute Aufschlüsselung der Vor- und Nachteile :
Es scheint also, dass Konstanten verwendet werden sollten, wenn es sehr unwahrscheinlich ist, dass sich der Wert jemals ändert, oder wenn keine externen Apps / Bibliotheken die Konstante verwenden. Statische schreibgeschützte Felder sollten verwendet werden, wenn eine Laufzeitberechnung erforderlich ist oder wenn externe Verbraucher ein Faktor sind.
constpublic const string MyStr;
ist eine Kompilierungszeitkonstante (Sie können sie beispielsweise als Standardparameter für einen Methodenparameter verwenden) und wird bei Verwendung einer solchen Technologie nicht verschleiert
static readonlypublic static readonly string MyStr;
ist Laufzeitkonstante . Dies bedeutet, dass es beim Start der Anwendung und nicht vorher ausgewertet wird. Aus diesem Grund kann es beispielsweise nicht als Standardparameter für eine Methode (Kompilierungsfehler) verwendet werden. Der darin gespeicherte Wert kann verschleiert werden.
OQ fragte nach static stringvs.const . Beide haben unterschiedliche Anwendungsfälle (obwohl beide als statisch behandelt werden).
Verwenden Sie const nur für wirklich konstante Werte (z. B. Lichtgeschwindigkeit - aber auch diese variiert je nach Medium). Der Grund für diese strenge Richtlinie ist, dass der const-Wert durch die Verwendung der const in Assemblys ersetzt wird, die darauf verweisen. Dies bedeutet, dass Versionsprobleme auftreten können, wenn sich die const an ihrem Definitionsort ändert (dh es sollte keine Konstante gewesen sein) Nach alldem). Beachten Sie, dass dies sogar private constFelder betrifft , da Sie möglicherweise Basis- und Unterklassen in verschiedenen Assemblys haben und private Felder vererbt werden .
Statische Felder sind an den Typ gebunden, in dem sie deklariert sind. Sie werden zur Darstellung von Werten verwendet, die für alle Instanzen eines bestimmten Typs gleich sein müssen. Diese Felder können beliebig oft geschrieben werden (sofern nicht schreibgeschützt).
Wenn Sie static readonlyvs gemeint haben const, dann würde ich static readonlyfür fast alle Fälle empfehlen, weil es zukunftssicherer ist.
Sie können den Wert von a static readonly stringnur im staticKonstruktor der Klasse oder in einem Variableninitialisierer ändern, während Sie den Wert einer constZeichenfolge nirgendwo ändern können .