Da ich nicht denke, dass die Antworten hier alles abdecken, möchte ich hier eine kleine Ergänzung machen.
Console.WriteLine(string format, params object[] pars)
Anrufe string.Format
. Das '+' impliziert eine Verkettung von Zeichenfolgen. Ich denke nicht, dass dies immer mit Stil zu tun hat. Ich neige dazu, die beiden Stile zu mischen, je nachdem, in welchem Kontext ich mich befinde.
Kurze Antwort
Die Entscheidung, vor der Sie stehen, hängt mit der Zuweisung von Zeichenfolgen zusammen. Ich werde versuchen, es einfach zu machen.
Sagen Sie, Sie haben
string s = a + "foo" + b;
Wenn Sie dies ausführen, wird Folgendes ausgewertet:
string tmp1 = a;
string tmp2 = "foo"
string tmp3 = concat(tmp1, tmp2);
string tmp4 = b;
string s = concat(tmp3, tmp4);
tmp
Hier handelt es sich nicht wirklich um eine lokale Variable, sondern um eine temporäre Variable für die JIT (sie wird auf den IL-Stack übertragen). Wenn Sie eine Zeichenfolge auf den Stapel schieben (zldstr
in IL für Literale), setzen Sie einen Verweis auf einen Zeichenfolgenzeiger auf dem Stapel.
In dem Moment, in dem Sie anrufen concat
diese Referenz wird zu einem Problem, da keine Zeichenfolgenreferenz verfügbar ist, die beide Zeichenfolgen enthält. Dies bedeutet, dass .NET einen neuen Speicherblock zuweisen und ihn dann mit den beiden Zeichenfolgen füllen muss. Der Grund dafür ist, dass die Zuweisung relativ teuer ist.
Was die Frage ändert zu: Wie können Sie die Anzahl der reduzieren concat
Operationen ?
Die grobe Antwort lautet also: string.Format
Für> 1 Concat funktioniert '+' für 1 Concat einwandfrei. Und wenn Sie sich nicht für die Optimierung der Mikroleistung interessieren, string.Format
funktioniert dies im allgemeinen Fall einwandfrei.
Ein Hinweis zur Kultur
Und dann gibt es so etwas wie Kultur ...
string.Format
ermöglicht es Ihnen, CultureInfo
in Ihrer Formatierung zu verwenden. Ein einfacher Operator '+' verwendet die aktuelle Kultur.
Dies ist besonders wichtig, wenn Sie Dateiformate und f.ex schreiben. double
Werte, die Sie einer Zeichenfolge hinzufügen. Auf verschiedenen Computern werden möglicherweise unterschiedliche Zeichenfolgen angezeigt, wenn Sie keine string.Format
explizite Zeichenfolge verwenden CultureInfo
.
F.ex. Überlegen Sie, was passiert, wenn Sie ein '.' ändern. Für ein ',' beim Schreiben Ihrer Datei mit durch Kommas getrennten Werten ... auf Niederländisch ist das Dezimaltrennzeichen ein Komma, sodass Ihr Benutzer möglicherweise nur eine 'lustige' Überraschung erhält.
Weitere detaillierte Antwort
Wenn Sie die genaue Größe der Zeichenfolge vorher nicht kennen, verwenden Sie am besten eine solche Richtlinie, um die von Ihnen verwendeten Puffer zu ordnen. Der Leerraum wird zuerst gefüllt, wonach die Daten kopiert werden.
Wachsen bedeutet, einen neuen Speicherblock zuzuweisen und die alten Daten in den neuen Puffer zu kopieren. Der alte Speicherblock kann dann freigegeben werden. An diesem Punkt erhalten Sie das Endergebnis: Wachsen ist eine teure Operation.
Der praktischste Weg, dies zu tun, ist die Verwendung einer Gesamtzuordnungsrichtlinie. Die gebräuchlichste Richtlinie besteht darin, Puffer mit einer Potenz von 2 zuzuweisen. Natürlich müssen Sie dies etwas intelligenter tun (da es keinen Sinn macht, von 1,2,4,8 zu wachsen, wenn Sie bereits wissen, dass Sie 128 Zeichen benötigen ) aber du bekommst das Bild. Die Richtlinie stellt sicher, dass Sie nicht zu viele der oben beschriebenen teuren Vorgänge benötigen.
StringBuilder
ist eine Klasse, die den zugrunde liegenden Puffer grundsätzlich in Zweierpotenzen zusammenfasst. string.Format
verwendet StringBuilder
unter der Haube.
Dies macht Ihre Entscheidung zu einem grundlegenden Kompromiss zwischen Gesamtzuweisung und Anhängen (-mehrfach) (ohne Kultur) oder einfach Zuweisung und Anhängen.
string.Format
, das keine zusammengesetzten Formatierungsfunktionen verwendet (dh einfach{0}
) und diese durch die erheblich schnellere Verkettung von Zeichenfolgen ersetzt. Ich frage mich, ob eine solche Leistung mit einem vorhandenen IL-Umschreiber wie PostSharp erreichbar ist.