Warum sollte string.Empty bei der Zuweisung zu einem String-Objekt über "" stehen?


13

Ich habe StyleCop über meinen Code ausgeführt, und eine der Empfehlungen von SA1122 lautet, string.Empty anstelle von "" zu verwenden, wenn einem Wert ein leerer String zugewiesen wird.

Meine Frage ist, warum dies als Best Practice angesehen wird. Oder wird dies als Best Practice angesehen? Ich gehe davon aus, dass zwischen den beiden Anweisungen kein Compilerunterschied besteht, sodass ich nur davon ausgehen kann, dass es sich um eine lesbare Sache handelt.

SO Frage und Antwort

Jon Skeet beantwortet die Frage


5
Ich bin mir sicher, dass dies bei Stack Overflow gefragt und beantwortet wurde - aber ich habe Probleme, es zu finden. Das hat damit zu tun, dass ein neues String-Objekt instanziiert werden muss, ""aber nichtstring.Empty
ChrisF

@ ChrisF Ahh, ich habe nicht daran gedacht, nach einem Stapelüberlauf für diese Art von Frage zu suchen. Ich werde einen Blick haben.
Dreza

1
dup of question on stackoverflow: stackoverflow.com/questions/151472/…
Quentin-Starin

@ ChrisF - Es wurde auf SO gefragt. Immer und immer und immer wieder ...
Oded

1
Here we go - stackoverflow.com/questions/151472/… - zurück vom September 2008.
ChrisF

Antworten:


11

Ein triftiger Grund ist, dass deutlich wird, dass es sich nicht um einen Tippfehler oder Platzhalter handelt, sondern dass Sie eigentlich die leere Zeichenfolge hier verwenden wollten.

Ich weiß nicht, ob es sich um "Best Practice" handelt.


7

Ich würde mir vorstellen, dass es zwei Gründe gibt, einen für die Lesbarkeit und zwei für eine geringfügige Leistungssteigerung.

Die Lesbarkeit ist einfach: Es ist viel schneller zu erkennen string.Emptyals "". Das Suchen nach string.Emptywird im Allgemeinen auch einfacher und möglicherweise genauer sein als das Suchen nach dem Literal. Es verdeutlicht auch die Absicht: Sie haben nicht nur einen Tippfehler gemacht oder vergessen, etwas zu beenden, Sie wollten wirklich eine leere Zeichenfolge.

Der Leistungsgrund ist auf Internierung zurückzuführen . Sie sehen, die Laufzeitumgebung führt eine Tabelle mit zuvor verwendeten Zeichenfolgen, damit Zeichenfolgen schnell verglichen werden können, ohne dass eine zeichenweise Prüfung durchgeführt werden muss. string.Emptyist bereits ein interner Verweis darauf, ""wo-wie die Eingabe des Literal möglicherweise nicht die internierte Version ergibt, was zu einem leichten Leistungseinbruch führt.


7
Ein Nitpick, der das Literal "" eingibt, gibt Ihnen immer die gleiche internierte Version von "", zumindest seit .Net 2 und höher.
Quentin-Starin

Richtig, der interne Artikel über MSDN ist in diesem Punkt etwas schwer zu folgen. Es scheint, als ob "" und "string.Empty" auf dieselbe interne Zeichenfolge verweisen sollten, aber es scheint, dass einige Unterschiede zwischen .net-Laufzeitversionen bestehen. Ich denke, jedes String-Literal, das mehrfach im Code vorkommt, wird beim zweiten interniert und weiterverwendet, ja?
CodexArcanum

4
Außerdem sollte ich betonen, dass ich, wenn ich leicht sage, winzig klein meine. "Wegen der Leistung" ist kein Grund, von einer Darstellung zur anderen zu wechseln, es ist nur eine nette Sache, die es wert ist, über die Laufzeit informiert zu werden.
CodexArcanum

4
Es ist auch zu beachten, dass der Leistungsaspekt nur für die Kompilierung gilt. Da beide auf dieselbe AWL kompilieren, sollte die Laufzeitleistung identisch sein.
lzcd

dass Leistungssteigerung wäre nur auf der Kompilierung
Ratsche Freak

4

string.Empty gewinnt in einem wirklich schwierigen Fall, der zu einem magischen Fehler führen kann und schwer zu debuggen ist:

Wenn es einen Nullbreitenraum in gibt "".


0

Laut einer Dokumentation, die ich gefunden habe, hat es damit zu tun, was der Compiler ausgibt.

Eine schnelle Suche zeigt: http://stylecop.soyuz5.com/SA1122.html

Warum es mit dieser Beschreibung unter "Lesbarkeitsregeln" abgelegt wird, ist rätselhaft.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.