Heute habe ich einen Standardparameterwert in einem Konstruktor erstellt.
%Vor%Der Compiler hat sich beschwert.
Der Standardparameterwert für "etwas" muss eine Kompilierzeit sein konstant.
Ich hatte den Eindruck, dass Empty in der String-Klasse eine Kompilierzeitkonstante war.
%Vor%Missverstehe ich die Bedeutung der Kompilierzeitkonstante, oder ist es einfach mehr Verrücktheit, die ich akzeptieren muss?
Die akzeptierte Antwort auf diese SO Frage Warum isn ' t String.Empty eine Konstante? ist:
Der Grund dafür, dass "static readonly" anstelle von "const" verwendet wird, liegt in der Verwendung von nicht verwaltetem Code, wie Microsoft hier in der Veröffentlichung "Common Source Infrastructure 2.0 der freigegebenen Quelle" angibt. Die zu überprüfende Datei ist sscli20 \ clr \ src \ bcl \ system \ string.cs.
Die leere Konstante enthält den leeren Zeichenfolgenwert. Wir müssen den String-Konstruktor aufrufen, damit der Compiler dies nicht als Literal markiert.
Wenn dies als Literal markiert wird, bedeutet dies, dass es nicht als Feld angezeigt wird, auf das wir von nativ zugreifen können.
Ich fand diese Informationen aus diesem praktischen Artikel bei CodeProject.
Ein static readonly
-Feld ist keine Kompilierzeitkonstante. Es ist nur ein statisches Feld, das sich nach der Klasse, in der die Initialisierung abgeschlossen ist, nicht ändern sollte.
In der aktuellen .net-Implementierung können Sie es sogar mit Reflektion ändern, was zu wirklich merkwürdigem Verhalten führt.
Sie können stattdessen ""
verwenden, was als String-Literal eine Zeitkonstante für die Kompilierung ist.
Ein readonly
-Feld ist eine Laufzeitkonstante. Es wird nicht an einen Wert gebunden, bis das Objekt (oder die Klasse, wenn das Feld static
ist) initialisiert wird.
Zeitkonstanten für die Kompilierung sind Literale (wie ""
- was im Prinzip dasselbe ist wie String.Empty
) und alles, was const
markiert.
Tags und Links string .net default-parameters