String-Verkettung mit oder ohne .ToString ()?

7

Ich habe eine Anweisung, in der eine Zeichenfolge auf die folgende Weise zugewiesen wird:

%Vor%

Gibt es Leistungsunterschiede zwischen i.ToString() oder einfach nur i , da beide nur in die (kulturinvariante?) Zeichenkette umgewandelt werden?

Ich bin mir der Existenz von String.Concat() , String.Format , StringBuilder usw. sehr wohl bewusst, aber für diesen Fall nehmen wir an, dass ich nur + Verkettung verwenden darf.

Vielen Dank im Voraus.

    
Webleeuw 29.12.2009, 14:01
quelle

6 Antworten

23

+ Verkettung verwendet String.Concat auf jeden Fall - String selbst legt keinen + Operator offen.

Also zum Beispiel:

%Vor%

ist zusammengestellt in:

%Vor%

Wenn Sie ToString direkt aufrufen, vermeiden Sie das Boxen und rufen die Concat(string, string) Überladung auf. Daher wird die Version mit dem ToString -Aufruf etwas effizienter sein - aber ich bezweifle stark, dass dies von Bedeutung sein wird, und ich würde Sie dringend bitten, mit der Version zu gehen, die Sie besser lesen können .

    
Jon Skeet 29.12.2009, 14:10
quelle
7

Die Verwendung von string + object erzwingt einen Aufruf von ToString () für das Objekt - es entspricht dem expliziten Aufruf.

    
Aviad P. 29.12.2009 14:04
quelle
3

ToString ist die Standardmethode zum Schreiben eines Objekts. Also, wenn Sie "i" oder "i.ToString ()" verwenden, ist das Gleiche.

Wenn Sie etwas über das Überladen von Operatoren in C ++ wissen, können Sie verstehen, wie "+" in diesem Fall funktioniert.

%Vor%

Ergebnis: msg: Alter ist 10. großartig?

s1: 15: Zwei plus drei ist 23

s2: 15: Zwei plus drei ist 5

    
Guilherme Ferreira 29.12.2009 14:14
quelle
1

Ich würde .ToString () aus Gewohnheit und Lesbarkeit verwenden, ich bin mir sicher, dass Sie woanders eine bessere Performance finden werden.

    
Mark Redman 29.12.2009 14:08
quelle
0
%Vor%

Da Ihre Resultierende in string ist und i int ist, wird "Bar _" + i verkettet und ruft .ToString () auf, damit das Objekt mit einer Zeichenkette verbunden wird. in Bezug auf die Leistung können Sie einige Leistungsmessungswerkzeuge verwenden

Ich benutze im Allgemeinen Casting, wenn ich zwei Diff-Objekte habe

    
Amit Ranjan 29.12.2009 14:46
quelle
0

Wie bereits von Jon Skeet erwähnt, ist der Punkt über Boxen sehr wichtig!

Wenn Sie explizit ToString () verwenden, gibt es kein Boxen, was bedeutet, dass um i keine Objektbox erstellt wird. Die Objektbox um i herum muss später vom Garbage Collector weggeworfen werden, was zu einer Leistungseinbuße führt.

Wenn Sie es nur ein paar Mal in Ihrem Programm tun, spielt es keine Rolle, aber wenn Sie sehr oft boxen, sollten Sie sich für die ToString () Version entscheiden.

    
Knasterbax 11.03.2013 13:09
quelle

Tags und Links