Was ist in .NET der Unterschied zwischen String.Empty
y ""
und sind sie austauschbar, oder gibt es einige zugrunde liegende Referenz- oder Lokalisierungsprobleme im Zusammenhang mit der Gleichheit, die String.Empty
werden sicherstellen, dass sie kein Problem darstellen?
Antworten
Zu viele Anzeigen?In .NET vor Version 2.0, ""
erzeugt ein Objekt, während string.Empty
erzeugt kein Objekt ref das macht string.Empty
effizienter.
In Version 2.0 und höher von .NET werden alle Vorkommen von ""
auf dasselbe Stringliteral verweisen, was bedeutet ""
ist gleichbedeutend mit .Empty
aber immer noch nicht so schnell wie .Length == 0
.
.Length == 0
ist die schnellste Option, aber .Empty
sorgt für einen etwas saubereren Code.
Siehe die .NET-Spezifikation für weitere Informationen .
Was ist der Unterschied zwischen String.Empty und "", und sind sie austauschbar
string.Empty
ist ein Nur-Lese-Feld, während ""
ist eine Kompilierzeitkonstante. Die Stellen, an denen sie sich unterschiedlich verhalten, sind:
Standard-Parameterwert in C# 4.0 oder höher
void SomeMethod(int ID, string value = string.Empty)
// Error: Default parameter value for 'value' must be a compile-time constant
{
//... implementation
}
Case-Ausdruck in switch-Anweisung
string str = "";
switch(str)
{
case string.Empty: // Error: A constant value is expected.
break;
case "":
break;
}
Attribut-Argumente
[Example(String.Empty)]
// Error: An attribute argument must be a constant expression, typeof expression
// or array creation expression of an attribute parameter type
Die vorherigen Antworten waren für .NET 1.1 korrekt (siehe das Datum des verlinkten Beitrags: 2003). Ab .NET 2.0 und später gibt es im Grunde keinen Unterschied mehr. Die JIT referenziert am Ende sowieso dasselbe Objekt auf dem Heap.
Gemäß der C#-Spezifikation, Abschnitt 2.4.4.5: http://msdn.microsoft.com/en-us/library/aa691090(VS.71).aspx
Jedes String-Literal führt nicht unbedingt zu einer neuen String-Instanz. Wenn zwei oder mehr String-Literale, die gemäß dem String-Gleichheitsoperator (Abschnitt 7.9.7) äquivalent sind, in der gleichen Assembly erscheinen, beziehen sich diese String-Literale auf die gleiche String-Instanz.
Jemand erwähnt dies sogar in den Kommentaren zum Beitrag von Brad Abram
Zusammenfassend lässt sich sagen, dass das praktische Ergebnis von "" vs. String.Empty gleich Null ist. Die JIT wird es am Ende herausfinden.
Ich persönlich habe die Erfahrung gemacht, dass das JIT viel schlauer ist als ich, und deshalb versuche ich, mich nicht zu sehr mit solchen Mikro-Compiler-Optimierungen aufzuhalten. Das JIT wird for()-Schleifen entfalten, redundanten Code entfernen, Methoden einbinden usw., und zwar besser und zu geeigneteren Zeitpunkten, als ich oder der C#-Compiler es je vorhersehen könnten. Lassen Sie das JIT seine Arbeit tun :)
Ich neige dazu, die String.Empty
statt ""
aus einem einfachen, aber nicht offensichtlichen Grund: ""
y ""
sind NICHT dasselbe, der erste hat sogar 16 Null-Breiten-Zeichen drin. Natürlich wird kein kompetenter Entwickler Null-Breiten-Zeichen in seinen Code einfügen, aber wenn sie dort hineingelangen, kann das ein Wartungsalptraum sein.
Anmerkungen:
-
Ich habe U+FEFF in diesem Beispiel.
-
Ich bin mir nicht sicher, ob SO diese Zeichen frisst, aber versuchen Sie es selbst mit einem der vielen Zeichen mit Null-Breite
-
Ich bin nur dank der folgenden Website darauf gestoßen https://codegolf.stackexchange.com/
- See previous answers
- Weitere Antworten anzeigen