Gibt es einen merklichen Leistungsunterschied zwischen der Verwendung der Zeichenfolgeninterpolation:
myString += $"{x:x2}";
vs String.Format ()?
myString += String.Format("{0:x2}", x);
Ich frage nur, weil Resharper die Korrektur veranlasst und ich zuvor getäuscht worden bin.
Antworten:
Auffällig ist relativ. Allerdings: Die Zeichenfolgeninterpolation wird
string.Format()
zur Kompilierungszeit aktiviert, sodass sie das gleiche Ergebnis erzielen sollten.Es gibt jedoch subtile Unterschiede: Wie wir aus dieser Frage ersehen können, führt die Verkettung von Zeichenfolgen im Formatbezeichner zu einem zusätzlichen
string.Concat()
Aufruf.quelle
int
verwendet wird).var a = "hello"; var b = $"{a} world";
Kompiliert zur Verkettung von Zeichenfolgen.var a = "hello"; var b = $"{a} world {1}";
Kompiliert im String-Format.Die String-Interpolation wird zur Kompilierungszeit in string.Format () umgewandelt.
Auch in string.Format können Sie mehrere Ausgaben für ein einzelnes Argument und verschiedene Ausgabeformate für ein einzelnes Argument angeben. Aber die String-Interpolation ist wohl besser lesbar. Es liegt also an Ihnen.
Es gibt einige Performance - Testergebnisse https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a
quelle
String::Format
. und manchmal inString::Concat
. Und der Leistungstest auf dieser Seite ist imho nicht wirklich aussagekräftig: Die Anzahl der Argumente, die Sie an jede dieser Methoden übergeben, hängt davon ab. concat ist nicht immer der schnellste, stringbuilder ist nicht immer der langsamste.Die Frage betraf die Leistung, aber der Titel sagt nur "vs", daher möchte ich noch ein paar Punkte hinzufügen, von denen einige jedoch eine Meinung haben.
Lokalisierung
string.Format
. Dafür gibt es jedoch Werkzeuge (zBReSharper
).Wartbarkeit (meiner Meinung nach)
string.Format
ist weitaus besser lesbar, da es sich auf den Satz konzentriert, den ich ausdrücken möchte, zum Beispiel beim Erstellen einer schönen und aussagekräftigen Fehlermeldung. Die Verwendung der{N}
Platzhalter gibt mir mehr Flexibilität und es ist einfacher, sie später zu ändern.string.Format
ist viel weniger anfällig dafür.Auf dieser Grundlage habe ich mich entschlossen, den
string.Format
größten Teil meines Codes beizubehalten. Ich habe jedoch eine Erweiterungsmethode vorbereitet, um eine flüssigere Codierungsmethode zu erhalten, die mir viel besser gefällt. Die Implementierung der Erweiterung ist ein Einzeiler und sieht im Gebrauch einfach so aus.Interpolation ist eine großartige Funktion, verstehen Sie mich nicht falsch. Aber IMO glänzt es am besten in jenen Sprachen, in denen die
string.Format
ähnliche Funktion fehlt, zum Beispiel JavaScript.quelle
{3}
X oder Y ist, insbesondere wenn Sie anfangen, Ihr Format neu zu ordnen. Madlibs Beispiel:$"It was a {adjective} day in {month} when I {didSomething}"
vsstring.Format("It was a {0} day in {1} when I {2}", adjective, month, didSomething)
->$"I {didSomething} on a {adjective} {month} day"
vsstring.Format("I {2} on a {0} {1} day", adjective, month, didSomething)
string.Format
Ich denke, Sie sind viel weniger anfällig für dieses Problem. Aber trotzdem habe ich betont, dass es meine Meinung ist :)