ToString
Verwendung
Nein, 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:
Wenn einer oder beide Operanden vom Typ Zeichenfolge sind, verketten die vordefinierten Additionsoperatoren die Zeichenfolgendarstellung der Operanden.
Quelle: C # Sprachspezifikation: Additionsoperator, MSDN .
Auf der anderen Seite die erste (ohne ToString
):
- Ist kürzer zu schreiben,
- Ist kürzer zu lesen,
- Ist einfacher zu warten und:
- zeigt genau die Absicht des Autors: Strings zu verketten.
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:
void Main()
{
var a = 3;
var b = " Hello";
var c = a + b;
Console.WriteLine(c);
}
wird in folgende IL übersetzt:
IL_0001: ldc.i4.3
IL_0002: stloc.0 // a
IL_0003: ldstr " Hello"
IL_0008: stloc.1 // b
IL_0009: ldloc.0 // a
IL_000A: box System.Int32
IL_000F: ldloc.1 // b
IL_0010: call System.String.Concat
IL_0015: stloc.2 // c
IL_0016: ldloc.2 // c
IL_0017: call System.Console.WriteLine
Siehst System.String.Concat
du das ? Das bedeutet, dass der Originalcode auch so geschrieben werden kann, was genau dasselbe IL bedeutet:
void Main()
{
var a = 3;
var b = " Hello";
var c = string.Concat(a, b); // This is the line which was changed.
Console.WriteLine(c);
}
Wenn Sie die Dokumentation vonstring.Concat(object[])
lesen , stellen Sie möglicherweise Folgendes fest:
Die Methode verkettet jedes Objekt in Argumenten, indem sie die parameterlose ToString
Methode dieses Objekts aufruft . Es werden keine Begrenzer hinzugefügt.
Das heißt, das ToString
ist überflüssig. Ebenfalls:
String.Empty
wird anstelle eines Nullobjekts im Array verwendet.
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:
var a = "Hello " + "World";
wird übersetzt in:
ldstr "Hello World"
stloc.0
Auf der anderen Seite:
var a = string.Concat("Hello ", "World");
wird übersetzt in:
ldstr "Hello "
ldstr "World"
call System.String.Concat
stloc.0
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 eine StringBuilder
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 Frage StringBuilder
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
. Ohne ToString
wird a null
durch eine leere Zeichenfolge ersetzt. Mit ToString
wird ein NullReferenceException
geworfen.
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.