String-Interpolation vs String.Format

113

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.

Krythic
quelle
4
Probieren Sie beide aus und sehen Sie, ob Sie den Unterschied bemerken.
Blorgbeard ist
57
@Blorgbeard Ehrlich gesagt bin ich faul. Und ich denke, es würde weniger Zeit in Anspruch nehmen, wenn einer von Ihnen hochstehenden Männern / Frauen die Antwort sofort wüsste.
Krythic
26
Ich liebe es, wie diese Frage, als ich sie zum ersten Mal stellte, in Vergessenheit geriet und jetzt, zwei Jahre später, bis zu +21 ist.
Krythic
46
Ernsthaft. Wie kann jemand die Nützlichkeit dieser Frage bezweifeln? Können Sie sich die totale Verschwendung von Arbeitsstunden vorstellen , wenn jeder, der diese Frage stellt, sie selbst ausprobieren und sehen müsste? Selbst wenn es nur 5 Minuten gedauert hat, multiplizieren Sie dies mit den über 10.000 Entwicklern, die diese Frage bisher gesehen haben. Und was machen Sie dann, wenn ein Mitarbeiter Ihre Ergebnisse bezweifelt? Mach das alles noch einmal? Oder verweisen Sie sie einfach auf diesen SO-Beitrag. Dafür ist es irgendwie da.
BTownTKD
8
@BTownTKD Das ist ein typisches Stackoverflow-Verhalten für Sie. Wenn jemand die Website für den beabsichtigten Zweck nutzt, wird er sofort entfremdet. Dies ist auch einer der Gründe, warum ich denke, dass wir Konten gemeinsam sperren dürfen. Viele Leute haben es einfach nicht verdient, auf dieser Seite zu sein.
Krythic

Antworten:

72

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.

Jeroen Vannevel
quelle
4
Tatsächlich kann die String-Interpolation in einigen Fällen zu einer String-Verkettung führen (z. B. wenn a intverwendet 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.
Omar Muscatello
5

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.

a = string.Format("Due date is {0:M/d/yy} at {0:h:mm}", someComplexObject.someObject.someProperty);

b = $"Due date is {someComplexObject.someObject.someProperty:M/d/yy} at {someComplexObject.someObject.someProperty:h:mm}";

Es gibt einige Performance - Testergebnisse https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a

Paul
quelle
2
String-Interpolation wird nur manchmal in verwandelt String::Format. und manchmal in String::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.
Matthias Burger
3

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

    • Die String-Interpolation kann aufgrund ihrer Inline-Code-Natur nicht lokalisiert werden. Vor der Lokalisierung wurde es in verwandelt string.Format. Dafür gibt es jedoch Werkzeuge (zB ReSharper).
  • Wartbarkeit (meiner Meinung nach)

    • string.Formatist 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.
    • Außerdem kann der Inline-Formatbezeichner bei der Interploation leicht falsch gelesen und zusammen mit dem Ausdruck während einer Änderung leicht gelöscht werden.
    • Bei Verwendung komplexer und langer Ausdrücke wird die Interpolation schnell noch schwieriger zu lesen und zu warten. In diesem Sinne lässt sie sich nicht gut skalieren, wenn sich der Code weiterentwickelt, und wird komplexer. string.Formatist viel weniger anfällig dafür.
    • Am Ende des Tages dreht sich alles um die Trennung von Bedenken: Ich mag es nicht, das, was es präsentieren soll, mit dem zu mischen, was präsentiert werden soll .

Auf dieser Grundlage habe ich mich entschlossen, den string.Formatgröß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.

var myErrorMessage = "Value must be less than {0:0.00} for field {1}".FormatWith(maximum, fieldName);

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.

Zoltán Tamási
quelle
Vielen Dank für das Hinzufügen.
Krythic
1
Ich würde der Wartbarkeit nicht zustimmen. Zugegeben, ReSharper macht es etwas einfacher, die eingefügten Werte mit den entsprechenden Indizes abzugleichen (und umgekehrt), aber ich denke, es ist noch kognitiver, herauszufinden, ob {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}"vs string.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)
drzaus
@drzaus Danke, dass du deine Gedanken geteilt hast. Sie haben gute Punkte, aber es ist nur wahr, wenn wir nur einfache, gut benannte lokale Variablen verwenden. Was ich schon oft gesehen habe, sind komplexe Ausdrücke, Funktionsaufrufe, was auch immer in interpolierte Zeichenfolgen eingefügt wird. Mit string.FormatIch denke, Sie sind viel weniger anfällig für dieses Problem. Aber trotzdem habe ich betont, dass es meine Meinung ist :)
Zoltán Tamási