int a = 1;
int b = 2;
int sum = a + b;
string expression = "Expression: " + a + " + " + b + " = " + sum;
Console.WriteLine(expression); //displays Expression 1 + 2 = 3
Sollte ich es benutzen:
string expression = "Expression: " + a + " + " + b + " = " + sum;
oder
string expression = "Expression: " + a.ToString() + " + " + b.ToString() + " = " + result.ToString();
Wird empfohlen, ToString()
beim Verketten string
und zu verwenden int
?
a + "" + b + ""
oder"" + a + b + ""
spielt es keine Rolle: Es ist alles eine Verkettung von Zeichenfolgen. Darin spielta + b + ""
es eine Rolle:a
undb
werden zuerst hinzugefügt."Expression: " + a
wird ein Fehler bei der Kompilierung ausgegeben (mit Option Strict On), und es"Expression: " & a
wird eine Verkettung von Zeichenfolgen durchgeführt.Antworten:
ToString
VerwendungNein, du solltest nicht verwenden
ToString
.Durch die Verkettung von Zeichenfolgen werden Nicht-Zeichenfolgen automatisch in Zeichenfolgen umgewandelt. Dies bedeutet, dass Ihre beiden Varianten nahezu identisch sind:
Quelle: C # Sprachspezifikation: Additionsoperator, MSDN .
Auf der anderen Seite die erste (ohne
ToString
):Also lieber den ersten.
Unter der Haube
Interessant ist auch, was unter der Haube passiert. Eine Möglichkeit, dies zu sehen, ist das Betrachten des IL-Codes in LINQPad. Dieses Programm:
wird in folgende IL übersetzt:
Siehst
System.String.Concat
du das ? Das bedeutet, dass der Originalcode auch so geschrieben werden kann, was genau dasselbe IL bedeutet:Wenn Sie die Dokumentation von
string.Concat(object[])
lesen , stellen Sie möglicherweise Folgendes fest:Das heißt, das
ToString
ist überflüssig. Ebenfalls:Was gut mit dem Fall umgeht, in dem einige der Operanden null sind (siehe Fußnote 1).
Während im letzten Beispiel die Verkettung in übersetzt wurde
string.Concat
, sollte man auch Compiler-Optimierungen hervorheben:wird übersetzt in:
Auf der anderen Seite:
wird übersetzt in:
Andere Alternativen
Es gibt natürlich auch andere Möglichkeiten, Zeichenfolgendarstellungen von Objekten in C # zu verketten.
StringBuilder
wird verwendet, wenn Sie viele Verkettungsvorgänge ausführen müssen, und verringert die Anzahl der erstellten Zwischenzeichenfolgen. Die Entscheidung, ob Sie eineStringBuilder
oder eine gewöhnliche Verkettung verwenden sollen, ist möglicherweise nicht einfach. Verwenden Sie einen Profiler oder suchen Sie nach relevanten Antworten für den Stapelüberlauf.Die Verwendung
StringBuilder
hat den großen Nachteil, dass der Code schwer zu lesen und zu warten ist. In einfachen Fällen wie dem in Ihrer FrageStringBuilder
ist dies nicht nur schädlich für die Lesbarkeit des Codes, sondern auch in Bezug auf die Leistung unbrauchbar.string.Join
sollte verwendet werden, wenn Trennzeichen hinzugefügt werden müssen.Offensichtlich verwendet nie
string.Join
mit einem leeren Begrenzer zu verketten Zeichenfolge.string.Format
kann verwendet werden, wenn String-Templating der String-Verkettung vorgezogen wird. Einer der Fälle, in denen Sie dies bevorzugen, ist der, in dem die Nachricht lokalisiert wird, wie in der Antwort von kunthet vorgeschlagen.Das Verwenden
string.Format
hat mehrere Nachteile, die es für einfache Fälle wie Ihren ungeeignet machen:Bei einfachen "{0}" - Platzhaltern ist oft unklar, welcher Parameter wohin führt. Es kommt häufig vor, dass die Parameter versehentlich vertauscht oder vergessen werden. Glücklicherweise führt C # 6 endlich eine String-Interpolation ein, die dieses Problem löst.
Die Laufzeitleistung kann sich verschlechtern. Natürlich nicht davon ausgehen,
string.Format
ist immer langsamer. Wenn es auf die Leistung ankommt, messen Sie zwei Ansätze und bestimmen Sie anhand Ihrer tatsächlichen Ergebnisse, welche Ansätze schneller sind als Annahmen.Der Code ist etwas länger zu schreiben, länger zu lesen und schwerer zu warten, obwohl dies äußerst geringfügig ist und Sie nicht allzu sehr stören sollte.
¹ Der Unterschied wird angezeigt, wenn eines der Objekte ist
null
. OhneToString
wird anull
durch eine leere Zeichenfolge ersetzt. MitToString
wird einNullReferenceException
geworfen.quelle
+
in den meisten Sprachen als schlechte Praxis angesehen. In diesem Fall würde ichstring.Concat
in vielen Fällenstring.Format
besser. Es ist sicherlich nicht Pythonic zu verwenden+
, und da PEP 3101%
ist auch für entmutigtstr.format
.null
wirklich "gut damit umzugehen"? Nun, es ist nicht so schlimm wie "On Error Resume Next" ...Concat(object[])
wird stattdessen verwendetConcat(string[])
. Ist"string " + i
also eigentlich nicht identisch mit"string " + i.ToString()
ToString()
: OPs Code in einem Fall,System.String.Concat
der Implementierung in dem anderen Fall. Die Antwort bleibt also gültig: Schreiben Sie nicht den Code, der keinen Nutzen hat.Verwenden Sie stattdessen den Zeichenfolgenformatierer. Es ist einfacher, Ihre Nummer in Zeichenfolgendarstellung oder Lokalisierung zu formatieren. z.B:
Weitere Informationen zu MSDN .
Der Formatierer von Zeichenfolgen ist jedoch weniger lesbar (und möglicherweise auch weniger leistungsfähig) als die Verkettung von Zeichenfolgen.
quelle
Wenn Sie
+
Verkettung verwenden, wird selbst dieString.Concat
Methode verwendet. String selbst macht keinen + -Operator verfügbar.beispielsweise:
ist kompiliert in:
Wenn Sie direkt anrufen
ToString
, wird das Boxen vermieden und dieConcat(string, string)
Überlastung aufgerufen . Daher wird derToString
Anruf etwas effizienter sein, obwohl er nicht signifikant genug ist. Sie sollten sich an das Beispiel halten, das Ihrer Meinung nach besser lesbar ist.quelle