In C # möchte ich einen Zeichenfolgenwert mit einer leeren Zeichenfolge initialisieren.
Wie soll ich das machen? Was ist der richtige Weg und warum?
string willi = string.Empty;
oder
string willi = String.Empty;
oder
string willi = "";
oder was?
c#
.net
string
initialization
Daniel Kreiseder
quelle
quelle
Antworten:
Verwenden Sie alles, was Sie und Ihr Team am besten lesen können.
Andere Antworten deuten darauf hin, dass bei jeder Verwendung eine neue Zeichenfolge erstellt wird
""
. Dies ist nicht der Fall - aufgrund der internen Zeichenfolge wird es entweder einmal pro Assembly oder einmal pro AppDomain erstellt (oder möglicherweise einmal für den gesamten Prozess - diesbezüglich nicht sicher). Dieser Unterschied ist vernachlässigbar - massiv, massiv unbedeutend.Was Sie besser lesbar finden, ist jedoch eine andere Sache. Es ist subjektiv und wird von Person zu Person unterschiedlich sein. Ich schlage vor, Sie finden heraus, was die meisten Leute in Ihrem Team mögen, und alle gehen aus Gründen der Konsistenz damit um. Persönlich finde ich
""
leichter zu lesen.Das Argument, dass
""
und" "
leicht miteinander verwechselt werden, wäscht sich nicht wirklich mit mir. Sofern Sie eine proportionale Schriftart verwenden (und ich habe nicht gearbeitet allen Entwicklern , die tun) , ist es ziemlich einfach zu sagen , der Unterschied.quelle
string.Empty
ist keine Konstante . Das bedeutet, dass in einigen Fällen, in denen eine Konstante für die Kompilierungszeit erforderlichstring.Empty
ist, nicht einmal legal ist. Dies umfasstcase ""
Blöcke inswitch
Anweisungen, Standardwerte für optionale Parameter , Parameter und Eigenschaften beim Anwenden von Attributen und viele andere Situationen (dem Leser überlassen). Da diesstring.Empty
in einigen häufigen Situationen nicht""
zulässig ist, ist es besser, die Konvention -everywhere zu verwenden.Es gibt wirklich keinen Unterschied in Bezug auf Leistung und Code. Bei Leistungstests gingen sie hin und her, wobei einer schneller als der andere war und nur Millisekunden.
Wenn Sie sich den Code hinter den Kulissen ansehen, sehen Sie auch keinen Unterschied. Der einzige Unterschied besteht in der IL, die
string.Empty
den Opcode verwendetldsfld
und""
den Opcode verwendetldstr
, aber das liegt nur daran, dass erstring.Empty
statisch ist und beide Anweisungen dasselbe tun. Wenn Sie sich die produzierte Baugruppe ansehen, ist sie genau dieselbe.C # -Code
IL-Code
Baugruppencode
quelle
Der beste Code ist überhaupt kein Code :
Folglich weniger Code ist besser Code: Bevorzugen
""
zustring.Empty
oderString.Empty
. Diese beiden sind sechsmal länger ohne zusätzlichen Nutzen - sicherlich ohne zusätzliche Klarheit, da sie genau die gleichen Informationen ausdrücken.quelle
i
ist sie besser als ein langer Variablenname. Noch allgemeinere, kürzere Variablennamen , die die gleichen Informationen in der gleichen Klarheit vermitteln, sind immer vorzuziehen. Es ist nur so, dass Sie eine bestimmte Zeichenlänge benötigen , um die erforderlichen Informationen auszudrücken , und ich leugne dies nicht (niemand ist es).Ein Unterschied besteht darin, dass Sie bei Verwendung einer
switch-case
Syntax nicht schreiben können,case string.Empty:
da es sich nicht um eine Konstante handelt. Du bekommst einCompilation error : A constant value is expected
Weitere Informationen finden Sie unter diesem Link: Zeichenfolge-leer-gegen-leer-Anführungszeichen
quelle
switch
Aussage ist ein sehr gutes Beispiel. Wenn Sie beispielsweise einen optionalen Parameter festlegenvoid MyMethod(string optional = "") { ... }
, ist die Verwendung ebenfalls nicht möglichstring.Empty
. Und wenn Sie dann natürlich einconst
Feld oder eine lokale Variable definieren möchten , ist diesconst string myString = "";
wiederum""
die einzige Option. Wenn nurstring.Empty
ein konstantes Feld wäre, gäbe es keinen Unterschied. Aber es ist nicht so, also müssen Sie in einigen Fällen verwenden""
. Warum also nicht die""
ganze Zeit nutzen?string.Empty
verhindert , dass Sie Konsistenz in Ihrer Codebasis erreichen: Sie müssen zwei verschiedene Entitäten verwenden, um dasselbe auszudrücken. Und um der Liste der Dinge hinzuzufügen, die Sie nicht tun können: Sie können nichtstring.Empty
mit Attributen verwenden .Ich würde es vorziehen
string
zuString
. Wahlstring.Empty
über""
eine Angelegenheit von der Wahl ein und mit ihm kleben. Der Vorteil der Verwendungstring.Empty
ist, dass es sehr offensichtlich ist, was Sie meinen, und dass Sie nicht versehentlich über nicht druckbare Zeichen wie"\x003"
in Ihrem kopieren""
.quelle
""
das beim Kopieren / Einfügen gefährlich ist, ist nichtig, weil Sie die leere Zeichenfolge niemals kopieren / einfügen. Für andere Saiten ist es natürlich immer etwas zu beachten.Ich wollte mich nicht einmischen, aber ich sehe einige falsche Informationen, die hier rausgeworfen werden.
Ich persönlich bevorzuge
string.Empty
. Das ist eine persönliche Präferenz, und ich beuge mich dem Willen jedes Teams, mit dem ich von Fall zu Fall zusammenarbeite.Wie einige andere erwähnt haben, gibt es überhaupt keinen Unterschied zwischen
string.Empty
undString.Empty
.Zusätzlich, und dies ist eine wenig bekannte Tatsache, ist die Verwendung von "" vollkommen akzeptabel. Jede Instanz von "" erstellt in anderen Umgebungen ein Objekt. .NET interniert jedoch seine Zeichenfolgen, sodass zukünftige Instanzen dieselbe unveränderliche Zeichenfolge aus dem internen Pool ziehen und jeder Leistungseinbruch vernachlässigbar ist. Quelle: Brad Abrams .
quelle
Ich persönlich bevorzuge "", es sei denn, es gibt einen guten Grund für etwas Komplexeres.
quelle
String.Empty
undstring.Empty
sind gleichwertig.String
ist der BCL-Klassenname;string
ist der C # -Alias (oder die Verknüpfung, wenn Sie so wollen). Gleich wie mitInt32
undint
. Siehe die DokumenteWeitere Beispiele finden .So weit wie
""
betrifft, so bin ich nicht wirklich sicher.Persönlich benutze ich immer
string.Empty
.quelle
Nahezu jeder Entwickler weiß, was "" bedeutet. Ich persönlich String.Empty das erste Mal begegnet und hatte einige Zeit Google - Suche , um herauszufinden , verbringen , wenn sie wirklich sind genau die gleiche Sache.
quelle
string.Empty
? Wussten Sie, was Sie""
zum ersten Mal gesehen haben?Dieses Thema ist ziemlich alt und lang, also entschuldigen Sie, wenn dieses Verhalten woanders erwähnt wurde. (Und zeigen Sie mir die Antwort, die dies abdeckt)
Ich habe einen Unterschied im Verhalten des Compilers festgestellt, wenn Sie
string.Empty
doppelte Anführungszeichen verwenden. Der Unterschied zeigt sich, wenn Sie die mit string.Empty oder in doppelten Anführungszeichen initialisierte Zeichenfolgenvariable nicht verwenden.Im Falle einer Initialisierung mit
string.Empty
der Compiler-Warnungwird niemals ausgegeben, während bei einer Initialisierung mit doppelten Anführungszeichen die erwartete Nachricht angezeigt wird.
Dieses Verhalten wird im Connect-Artikel unter diesem Link erläutert: https://connect.microsoft.com/VisualStudio/feedback/details/799810/c-warning-cs0219-not-reported-when-assign-non-constant-value
Wenn ich es richtig verstehe, möchten sie einem Programmierer grundsätzlich erlauben, eine Variable mit dem Rückgabewert einer Funktion für Debugging-Zwecke festzulegen, ohne ihn mit einer Warnmeldung zu belästigen, und sie haben die Warnung daher nur bei kostenpflichtigen Zuweisungen und Zeichenfolgen eingeschränkt. Leer ist keine Konstante, sondern ein Feld.
quelle
var unused = "literal";
vom Compiler vollständig optimiert (entfernt) werden kann. Es kann keine Nebenwirkungen haben. Andererseitsvar unused = MyClass.Member;
kann nicht vollständig entfernt werden. Das liegt daran, dass das LesenMember
Nebenwirkungen haben kann. WennMember
es sich um eine statische Eigenschaft mit einemget
Accessor handelt, ist klar, dass der Aufruf des Getters beibehalten werden muss. Aber selbst wennMember
es sich um ein statisches Feld handelt, kann der statische Konstruktor möglicherweise den Nebeneffekt ausführen. Sicher wäre es ein schlechter Codierungsstil , wenn es so wäre. Aber du brauchst einen Dummy zum LesenMember
.Ich habe diesen sehr einfachen Test mit der folgenden Methode in einer Konsolenanwendung durchgeführt:
Dies zeigt eindeutig , dass alle drei Variablen nämlich
str1
,str2
undstr3
obwohl andere Syntax auf die genau gleiche Zeichenfolge im Speicher (der Länge Null) Objekt verweisen unter Verwendung initialisiert wird. Ich habe diesen Test in der .NET 4.5-Konsolenanwendung durchgeführt. Intern haben sie also keinen Unterschied und es läuft alles auf die Bequemlichkeit hinaus, welche Sie als Programmierer verwenden möchten. Dieses Verhalten der Zeichenfolgenklasse wird als Zeichenfolgeninternierung in .NET bezeichnet. Eric Lippert hat hier einen sehr schönen Blog , der dieses Konzept beschreibt.quelle
Eine der oben genannten.
Es gibt viele, viele bessere Dinge zu pontifizieren. Zum Beispiel, welche Farbe Rinde am besten zu einem Baum passt, denke ich, dass sie vage braun mit einem Hauch von Dulcet-Moos ist.
quelle
Ich bevorzuge String.Empty, abgesehen von den anderen Gründen, um sicherzustellen, dass Sie wissen, was es ist und dass Sie den Inhalt nicht versehentlich entfernt haben, sondern hauptsächlich für die Internationalisierung. Wenn ich eine Zeichenfolge in Anführungszeichen sehe, muss ich mich immer fragen, ob dies neuer Code ist und in eine Zeichenfolgentabelle eingefügt werden sollte. Jedes Mal, wenn Code geändert / überprüft wird, müssen Sie nach "etwas in Anführungszeichen" suchen, und ja, Sie können die leeren Zeichenfolgen herausfiltern, aber ich sage den Leuten, dass es eine gute Praxis ist, Zeichenfolgen niemals in Anführungszeichen zu setzen, es sei denn, Sie wissen, dass sie nicht lokalisiert werden .
quelle
Niemand erwähnte, dass String in VisualStudio anders farblich gekennzeichnet ist als String. Welches ist wichtig für die Lesbarkeit. Außerdem wird normalerweise Kleinbuchstaben für vars und type verwendet, keine große Sache, aber String.Empty ist eine Konstante und keine var oder type.
quelle
string
ist synonym fürSystem.String
Typ. Sie sind identisch.Die Werte sind ebenfalls identisch:
string.Empty == String.Empty == ""
Ich würde nicht Zeichen - Konstante „“ im Code verwenden, eher
string.Empty
oderString.Empty
- einfacher zu sehen , was Programmierer gedacht.Zwischen
string
undString
ich mag Kleinbuchstabenstring
mehr, nur weil ich viele Jahre mit Delphi gearbeitet habe und der Delphi-Stil Kleinbuchstaben iststring
.Wenn ich Ihr Chef wäre, würden Sie schreiben
string.Empty
quelle
Ich würde bevorzugen
string.Empty
über ,String.Empty
weil Sie es , ohne dass verwenden kann ein schließenusing System;
, in Ihrer Datei.Wie für die Kommissionierung
""
überstring.Empty
, ist es persönliche Präferenz und soll von Ihrem Team entschieden werden.quelle
string.Empty
Konstanten zu verwenden, ohne einenusing System
Namespace zu importieren - Schlüsselwörter in C # werden einfach in ihren vollständig qualifizierten Namen konvertiert, der auch den Namespace enthält, bevor sie als MSIL in die Ausgabe * .dll oder * geschrieben werden. exe-Datei. Wird also effektivstring.Empty
wieSystem.String.Empty
in der MSIL vom Compiler geschrieben. Und da Sie vielleicht bereits wissen, dass Sie, wenn Sie einen vollständig qualifizierten Typnamen erwähnen, den Import von Namespaces oben in Ihrer Codedatei überspringen können.Ich mache keinen Unterschied. Der letzte ist der am schnellsten zu tippende :)
quelle
Es spielt keine Rolle - sie sind genau das gleiche. Die Hauptsache ist jedoch, dass Sie konsequent sein müssen
ps Ich kämpfe die ganze Zeit mit dieser Art von "Was ist das Richtige?".
quelle
Es ist eine Vorliebe für den Codestil, wie .NET mit Zeichenfolgen umgeht. Hier sind jedoch meine Meinungen :)
Ich verwende immer die BCL-Typnamen, wenn ich auf statische Methoden, Eigenschaften und Felder zugreife:
String.Empty
oderInt32.TryParse(...)
oderDouble.Epsilon
Ich verwende immer die C # -Schlüsselwörter, wenn ich neue Instanzen deklariere:
int i = 0;
oderstring foo = "bar";
Ich verwende selten nicht deklarierte String-Literale, da ich den Code scannen möchte, um sie zu wiederverwendbaren benannten Konstanten zu kombinieren. Der Compiler ersetzt Konstanten sowieso durch die Literale, so dass dies eher eine Möglichkeit ist, magische Zeichenfolgen / Zahlen zu vermeiden und ihnen mit einem Namen etwas mehr Bedeutung zu geben. Außerdem ist das Ändern der Werte einfacher.
quelle
Ich benutze die dritte, aber von den anderen beiden scheint die erste weniger seltsam. string ist ein Alias für String, aber es fühlt sich nicht gut an, sie in einer Zuweisung zu sehen.
quelle
Jeder der ersten beiden wäre für mich akzeptabel. Ich würde den letzten vermeiden, da es relativ einfach ist, einen Fehler einzuführen, indem ein Leerzeichen zwischen die Anführungszeichen gesetzt wird. Dieser spezielle Fehler wäre durch Beobachtung schwer zu finden. Unter der Annahme, dass keine Tippfehler vorliegen, sind alle semantisch äquivalent.
[BEARBEITEN]
Vielleicht möchten Sie auch immer entweder
string
oderString
aus Gründen der Konsistenz verwenden, aber das bin nur ich.quelle
Ich habe persönlich "" gesehen, was zweimal zu (geringfügigen) Problemen führte. Einmal war dies auf einen Fehler eines Junior-Entwicklers zurückzuführen, der neu in der teambasierten Programmierung war, und der andere war ein einfacher Tippfehler, aber die Tatsache ist die Verwendung von string.Empty hätte beide Probleme vermieden.
Ja, dies ist in hohem Maße ein Urteilsspruch, aber wenn eine Sprache Ihnen mehrere Möglichkeiten bietet, Dinge zu tun, neige ich dazu, mich zu derjenigen zu neigen, die die größte Compiler-Kontrolle und die stärkste Durchsetzung während der Kompilierungszeit hat. Das ist nicht "". Es geht darum, bestimmte Absichten auszudrücken.
Wenn Sie string.EMpty oder Strng.Empty eingeben, teilt Ihnen der Compiler mit, dass Sie es falsch gemacht haben. Sofort. Es wird einfach nicht kompiliert. Als Entwickler zitieren Sie bestimmte Absicht, die der Compiler (oder ein anderer Entwickler) in keiner Weise falsch interpretieren kann, und wenn Sie es falsch machen, können Sie keinen Fehler erstellen.
Wenn Sie "" eingeben, wenn Sie "" meinen, oder umgekehrt, macht der Compiler glücklich, was Sie ihm gesagt haben. Ein anderer Entwickler kann möglicherweise Ihre spezifische Absicht ermitteln oder nicht. Fehler erstellt.
Lange vor string.Empty habe ich eine Standardbibliothek verwendet, die die Konstante EMPTY_STRING definiert hat. Wir verwenden diese Konstante weiterhin in case-Anweisungen, in denen string.Empty nicht zulässig ist.
Wenn immer möglich, lassen Sie den Compiler für Sie arbeiten und beseitigen Sie die Möglichkeit menschlicher Fehler, egal wie klein sie sind. IMO, dies übertrumpft "Lesbarkeit", wie andere zitiert haben.
Spezifität und Durchsetzung der Kompilierungszeit. Es ist was zum Abendessen.
quelle
Ich verwende "", weil es in meinem Code deutlich gelb gefärbt ist ... aus irgendeinem Grund ist String.Empty in meinem Visual Studio-Code-Design ganz weiß. Und ich glaube, das ist mir am wichtigsten.
quelle
Der Compiler sollte sie auf lange Sicht alle gleich machen. Wählen Sie einen Standard, damit Ihr Code leicht zu lesen ist, und bleiben Sie dabei.
quelle
Ich habe mir nur einen Code angesehen und diese Frage kam mir in den Sinn, die ich einige Zeit zuvor gelesen hatte. Dies ist sicherlich eine Frage der Lesbarkeit.
Betrachten Sie den folgenden C # -Code ...
vs.
Ich persönlich finde letzteres weniger mehrdeutig und leichter zu lesen.
Wie von anderen hervorgehoben, sind die tatsächlichen Unterschiede vernachlässigbar.
quelle
Ich denke, die zweite ist "richtig", aber um ehrlich zu sein, denke ich nicht, dass es wichtig sein wird. Der Compiler sollte intelligent genug sein, um alle mit genau demselben Bytecode zu kompilieren. Ich benutze "" mich.
quelle
Obwohl der Unterschied sehr, sehr gering ist, besteht der Unterschied immer noch.
1) "" erstellt ein Objekt, während String.Empty dies nicht tut. Dieses Objekt wird jedoch einmal erstellt und später aus dem Zeichenfolgenpool referenziert, wenn Sie ein anderes "" im Code haben.
2) String und String sind gleich, aber ich würde empfehlen, String.Empty (sowie String.Format, String.Copy usw.) zu verwenden, da die Punktnotation eine Klasse angibt, keinen Operator, und eine Klasse, die mit einem Großbuchstaben beginnt, entspricht C # -Codierungsstandards.
quelle
Auf http://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx :
quelle
Die leere Zeichenfolge ist wie eine leere Menge, nur ein Name, den jeder zum Aufrufen verwendet
""
. Auch in formalen Sprachen werden Zeichenfolgen, die aus einem Alphabet mit der Länge Null erstellt wurden, als leere Zeichenfolge bezeichnet. Sowohl set als auch string haben ein spezielles Symbol. Leere Zeichenfolge: ε und leere Menge: ∅. Wenn Sie über diese Zeichenfolge mit der Länge Null sprechen möchten, nennen Sie sie die leere Zeichenfolge, damit jeder genau weiß, worauf Sie sich beziehen. Wenn Sie nun die leere Zeichenfolge nennen, warum nichtstring.Empty
im Code verwenden, zeigt dies, dass die Absicht explizit ist. Nachteil ist, dass es keine Konstante ist und daher nicht überall verfügbar ist, wie in Attributen. (Aus technischen Gründen ist es keine Konstante, siehe Referenzquelle.)quelle
Ich bevorzuge,
""
weil es kürzer ist undString.Empty
ein Problem löst, das es nicht gibt.quelle