it-swarm.com.de

string.format mit Variablen vs Inline-Variablen

Was sind die Vor-/Nachteile (falls vorhanden) bei der Verwendung?

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

versus

string output; 
int i = 10;
output = "the int is " + i;

Ich habe immer das letztere Beispiel verwendet, aber es scheint, als ob eine gute Mehrheit der Online-Tutorials das Beispiel string.format verwendet. Ich glaube nicht, dass es echte Unterschiede in Bezug auf die Effizienz gibt. Mein erster Gedanke ist, dass ein Codierer die Zeichenfolge nicht ständig brechen muss, um Variablen einzufügen.

9
Jim

Wenn Sie die Übersetzung in Ihrem Projekt für wichtig halten, hilft Ihnen die erste Syntax dabei.

Zum Beispiel können Sie haben:

static final string output_en = "{0} is {1} years old.";
static final string output_fr = "{0} a {1} ans.";

int age = 10;
string name = "Henri";
System.out.println(string.Format(output_en, name, age));
System.out.println(string.Format(output_fr, name, age));

Beachten Sie auch, dass sich Ihre Variablen mit dieser Syntax möglicherweise nicht immer an derselben Stelle im Satz befinden:

static final string output_yoda = "{1} years {0} has.";
22
Alex Garcia

Überprüfen Sie die erste Antwort für https://stackoverflow.com/questions/4671610/why-use-string-format . Es deckt meiner Meinung nach alles ab, warum es besser ist.

Außerdem verfügt jede .NET-Assembly über einen internen Pool, der eine Sammlung eindeutiger Zeichenfolgen enthält. Wenn Ihr Code kompiliert wird, werden alle Zeichenfolgenliterale, auf die Sie in Ihrem Code verweisen, diesem Pool hinzugefügt. Wenn Sie einen Code haben, der so aussieht:

"the int is " + i + " and the double is " + d

Das macht es 2 Saiten im Pool.

Wenn Sie haben:

"the int is {0} and the double is {1}"

Sie haben nur einen String im Pool.

Es ist etwas komplizierter zu wissen, wann Strings interniert sind und wann nicht, weil der Compiler über einige Informationen verfügt, wenn er Strings erkennt, die manchmal nicht interniert werden müssen ... Schauen Sie sich zum Beispiel dieser Artikel an = was mehr Einblick in diese Angelegenheit gibt.

Bearbeiten: Nach einigem Ausgraben habe ich eine interessante Antwort auf die Frage gefunden Wann ist es besser, String.Format gegen String-Verkettung zu verwenden? . Kurz gesagt, der Autor der Antwort mit +30 Stimmen spricht sich überzeugend für die Verkettung von Zeichenfolgen aus, wenn die Lokalisierung nicht beteiligt ist.

8
Jalayn

Ich bevorzuge den ersten Weg, weil ich so genau sehen kann, wie der String bei der Ausgabe aussehen wird. Es ist sehr leicht zu vergessen, ein Leerzeichen hinzuzufügen oder zusätzlichen Abstand hinzuzufügen, wenn nur Zeichenfolgen angehängt werden.

Ich bin mir sicher, dass der erste Weg auch einen Leistungsvorteil bietet, da keine zusätzlichen Zeichenfolgen erstellt werden müssen. aber das ist nicht mein Hauptanliegen.

4
John Kraft

Mit der ersten Option können Sie eine häufig verwendete Formatzeichenfolge speichern, die erforderliche Eingabe reduzieren und die Aktualisierung der Zeichenfolge überall dort vereinfachen, wo sie verwendet wird. Grundsätzlich ermöglicht die erste Option die einfache Implementierung von DRY. Es ist auch eine viel schönere Syntax, wenn mehrere Variablen in einer Zeichenfolge verwendet werden müssen, wie Sie bereits erwähnt haben.

2
Ryathal

Ich denke, mit string.Format() ist es einfacher zu sehen, was genau das Ergebnis sein wird (damit Sie keine Probleme mit vergessenen Leerzeichen oder Ähnlichem haben), und es ist auch einfacher zu tippen und zu ändern.

Wenn Sie eine sehr einfache Formatierung durchführen möchten, ist die Verwendung des Operators + Plus möglicherweise einfacher, aber ich verwende ihn eher nur, wenn zwei Zeichenfolgen verkettet werden, nicht mehr.

Um zu zeigen, wie string.Format() einfacher zu ändern ist, sollten Sie in Ihrem Beispiel am Ende des Satzes einen Punkt hinzufügen: von string.Format("The int is {0}", i) zu string.Format("The int is {0}.", i) ist nur ein Zeichen. Aber von "the int is " + i Zu "the int is " + i + '.' Zu wechseln, ist viel mehr.

Ein weiterer Vorteil von string.Format() besteht darin, dass Sie das zu verwendende Format wie string.Format("The int is 0x{0:X}.", i) einfach angeben können. Dies ist noch wichtiger beim Formatieren des Datums.

In Bezug auf die Effizienz ist string.Format() höchstwahrscheinlich langsamer als einfache Zeichenfolgenverkettungen. Aber Code wie dieser befindet sich höchstwahrscheinlich nicht auf einem heißen Pfad, daher spielt es keine Rolle. Und wenn ja, sind Sie wahrscheinlich besser dran, wenn Sie StringBuilder verwenden.

1
svick

Verwenden Sie den Code, der Ihren Code am besten lesbar macht. Mach dir keine Sorgen über die Leistung.

Für Ihr Beispiel unten bevorzuge ich B, weil es nur besser lesbar ist. Aber auch die obigen Sprachübersetzungen sind sinnvoll. Lassen Sie sich nicht von jemandem zwingen, string.Format zu verwenden. Lesen Sie stattdessen Jeff Atwoods hervorragenden Blog auf dem Die traurige Tragödie des Mikrooptimierungstheaters und verweisen Sie darauf

EIN:

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

versus

B:

string output; 
int i = 10;
output = "the int is " + i;
1
Makach