Ich lese Effective C # von Bill Wagner. In Punkt 14 - Minimieren der Logik für die doppelte Initialisierung zeigt er das folgende Beispiel für die Verwendung der neuen optionalen Parameterfunktion in einem Konstruktor:
public MyClass(int initialCount = 0, string name = "")
Beachten Sie, dass er ""
anstelle von verwendet string.Empty
.
Er kommentiert:
Sie werden [in einem Beispiel oben] feststellen, dass der zweite Konstruktor "" für den Standardwert im Parameter name angegeben hat und nicht den üblicheren
string.Empty
. Das liegt daran, dassstring.Empty
es sich nicht um eine Kompilierungszeitkonstante handelt. Es ist eine statische Eigenschaft, die in der Zeichenfolgenklasse definiert ist. Da es sich nicht um eine Kompilierungskonstante handelt, können Sie sie nicht als Standardwert für einen Parameter verwenden.
Wenn wir die string.Empty
Statik nicht in allen Situationen verwenden können, macht das dann nicht den Zweck zunichte? Ich dachte, wir würden es verwenden, um sicherzugehen, dass wir ein systemunabhängiges Mittel haben, um auf die leere Zeichenfolge zu verweisen. Ist mein Verständnis falsch? Vielen Dank.
UPDATE
Nur ein nachfolgender Kommentar. Laut MSDN:
Jeder optionale Parameter hat einen Standardwert als Teil seiner Definition. Wenn für diesen Parameter kein Argument gesendet wird, wird der Standardwert verwendet. Standardwerte müssen Konstanten sein.
Dann können wir System.Environment.NewLine
weder neu instanziierte Objekte noch als Standardwerte verwenden. Ich habe VS2010 noch nicht verwendet und das ist enttäuschend!
quelle
Antworten:
Ab dem C # 2.0-Compiler macht es
String.Empty
sowieso wenig Sinn , und tatsächlich ist es in vielen Fällen eine Pessimisierung, da der Compiler einige Verweise auf Inline einfügen kann,""
aber nicht dasselbe tun kannString.Empty
.In C # 1.1 war es nützlich zu vermeiden, viele unabhängige Objekte zu erstellen, die alle die leere Zeichenfolge enthalten, aber diese Zeiten sind vorbei.
""
funktioniert gut.quelle
Nichts hindert Sie daran, Ihre eigene Konstante für die leere Zeichenfolge zu definieren, wenn Sie sie wirklich als optionalen Parameterwert verwenden möchten:
[Abgesehen davon ist ein Grund, den
String.Empty
Sie""
generell bevorzugen , der in den anderen Antworten nicht erwähnt wurde, dass es verschiedene Unicode-Zeichen (Joiner mit der Breite Null usw.) gibt, die für das bloße Auge praktisch unsichtbar sind. Etwas, das aussieht,""
ist also nicht unbedingt die leere Zeichenfolge, währendString.Empty
Sie genau wissen, was Sie verwenden. Ich erkenne, dass dies keine häufige Fehlerquelle ist, aber es ist möglich.]quelle
Aus der ursprünglichen Frage:
Inwiefern kann die leere Zeichenfolge von System zu System variieren? Es ist immer eine Zeichenfolge ohne Zeichen! Ich hätte wirklich Angst, wenn ich jemals eine Implementierung gefunden hätte, bei der
string.Empty == ""
false zurückgegeben wurde :) Dies ist nicht dasselbe wie so etwasEnvironment.NewLine
.Aus dem Kopfgeldposten des Terroristen:
Nun, das wird bestimmt nicht passieren.
Ich persönlich hätte mir auch einen ganz anderen Standardmechanismus gewünscht, aber die Funktionsweise optionaler Parameter war von Anfang an in .NET - und es bedeutet immer, eine Konstante in die Metadaten einzubetten, damit der aufrufende Code diese Konstante in den Aufruf kopieren kann Website, wenn kein entsprechendes Argument angegeben wird.
Mit ist
string.Empty
es wirklich sinnlos - mit""
wird tun, was Sie wollen; Ist es so schmerzhaft, das String-Literal zu verwenden? (Ich benutze das Literal überall - ich benutze es niestring.Empty
- aber das ist ein anderes Argument.)Das ist , was mir über diese Frage überrascht - die Beschwerde dreht sich um etwas , was nicht der Fall ist Ursache ein echtes Problem tatsächlich. Dies ist wichtiger in Fällen, in denen der Standard zur Ausführungszeit berechnet werden soll, da er tatsächlich variieren kann. Ich könnte mir zum Beispiel Fälle vorstellen, in denen Sie eine Methode mit einem
DateTime
Parameter aufrufen möchten und standardmäßig "die aktuelle Zeit" verwenden möchten . Im Moment ist die einzige vage elegante Problemumgehung, die ich dafür kenne ,:... aber das ist nicht immer angemessen.
Abschließend:
string.Empty
es ist sowieso sinnlosquelle
Environment.Newline
. Das einzige, was in Ihrem Beispiel fehlt, ist die Überprüfung der Variablen auf null und das Zurückwerfen einer Ausnahme an den Entwickler, die ihm mitteilt, dass es zwar nullbar ist, es aber ist nicht akzeptiert.if(dateTime == null){ throw new ArgumentException("The dateTime parameter must be set. Nullable type used for device independent variable set.");}
oder etwas ähnliches. Aber ich mag das wirklich! Irgendwelche anderen Vorbehalte, um es auf Ihre Weise zu tun?Ich benutze nie string.Empty, ich kann den Sinn nicht erkennen. Vielleicht macht es es Leuten leichter, die wirklich neu in der Programmierung sind, aber ich bezweifle, dass es auch dafür nützlich ist.
quelle
""
und" "
, aber ich kann nicht sagen, dass" "
das alles so häufig ist.Ich denke, die Idee hinter string.Empty ist, dass es die Lesbarkeit verbessert. Es ist nicht wie bei Newline, wo es einen Unterschied gibt, wie es auf verschiedenen Plattformen dargestellt wird. Es ist schade, dass es nicht in einem Standardparameter verwendet werden kann. Es verursacht jedoch keine Probleme, wenn Sie zwischen Windows und etwas wie Mono unter Linux portieren.
quelle
String.Empty
lesbarer halten. . . Ich persönlich finde das allerdings etwas verrückt.""
ist wahrscheinlich die häufigste Zeichenfolge, die es gibt, und jeder hat sie milliardenfach gesehen. Wie ist sie also unlesbar?String.Empty
ist ungefähr so nützlich, als ob es eine gäbeInt32.Zero
.Als FYI sieht es so aus, als ob die gleiche Einschränkung für Werte gilt, die an Attributkonstruktoren übergeben werden - sie müssen konstant sein. Da string.empty definiert ist als:
Anstelle einer tatsächlichen Konstante kann sie nicht verwendet werden.
quelle
Ich benutze
string.Empty
nur zur besseren Lesbarkeit.Wenn jemand anderes meinen Code später lesen / ändern muss, weiß er, dass ich nach einer leeren Zeichenfolge suchen oder diese festlegen wollte. Die Verwendung von just
""
kann manchmal zu Fehlern und Verwirrung führen, da ich möglicherweise vergessen habe, die gewünschte Zeichenfolge dort einzufügen.Beispielsweise:
vs.
Die erste
if
Aussage scheint mir einfach viel bewusster und lesbarer zu sein. Da dies jedoch nur eine Präferenz ist, sehe ich den Zugschlag wirklich nicht darin,""
stattdessen verwenden zu müssenstring.Empty
.quelle
Die vielleicht beste Lösung für dieses Problem ist eine Überlastung dieser Methode auf folgende Weise:
quelle