Dies ist nur eine Ergänzung zu den anderen Antworten. Ich werde sie nicht wiederholen (jetzt vier Jahre später).
Es gibt Situationen, in denen eine const
und eine nicht-const unterschiedliche Semantiken haben. Zum Beispiel:
const int y = 42;
static void Main()
{
short x = 42;
Console.WriteLine(x.Equals(y));
}
gibt True
aus, während:
static readonly int y = 42;
static void Main()
{
short x = 42;
Console.WriteLine(x.Equals(y));
}
False
ausgibt.
Der Grund dafür ist, dass die Methode x.Equals
zwei Überladungen hat, eine, die einen short
(System.Int16
) und eine, die ein object
(System.Object
) annimmt. Jetzt stellt sich die Frage, ob eine oder beide mit meinem y
-Argument übereinstimmen.
Wenn y
ein Kompilierzeitkonstante (Literal) ist, der const
-Fall, wird es wichtig, dass eine implizite Konvertierung von int
nach short
vorhanden ist, vorausgesetzt, dass die int
eine Konstante ist und der C#-Compiler überprüft, ob der Wert im Bereich eines short
liegt (was bei 42
der Fall ist). Siehe Implizite Konstantenausdruckskonvertierungen in der C#-Sprachspezifikation. Also müssen beide Überladungen berücksichtigt werden. Die Überladung Equals(short)
wird bevorzugt (jedes short
ist ein object
, aber nicht alle object
sind short
). Daher wird y
in ein short
konvertiert und diese Überladung verwendet. Dann vergleicht Equals
zwei short
von identischem Wert, was zu true
führt.
Wenn y
keine Konstante ist, existiert keine implizite Konvertierung von int
nach short
. Das liegt daran, dass im Allgemeinen ein int
zu groß sein kann, um in ein short
zu passen. (Eine explizite Konvertierung existiert, aber ich habe nicht Equals((short)y)
gesagt, daher ist das nicht relevant.) Wir sehen, dass nur eine Überladung zutrifft, die Equals(object)
. Daher wird y
in ein object
geboxt. Dann vergleicht Equals
ein System.Int16
mit einem System.Int32
, und da die Laufzeittypen nicht übereinstimmen, ergibt das false
.
Wir kommen zu dem Schluss, dass in einigen (seltenen) Fällen die Änderung eines const
-Typmembers in ein static readonly
Feld (oder umgekehrt, wenn das möglich ist) das Verhalten des Programms ändern kann.
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/…