350 Stimmen

Was ist der Unterschied zwischen String.Empty und "" (leerer String)?

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?

361voto

Brian R. Bondy Punkte 325712

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 .

239voto

Habib Punkte 211435

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

48voto

chadmyers Punkte 3780

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 :)

43voto

James Newton-King Punkte 46367

String.Empty es un readonly Feld, während "" es un const . Das heißt, Sie können nicht verwenden String.Empty in einer switch-Anweisung, da es sich nicht um eine Konstante handelt.

26voto

Justinw Punkte 516

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/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X