2011-01-12 13 views
8

In C# ist es möglich, Strings auf verschiedene Weise zu verketten:Wann sollte ich String.Format oder String.Concat anstelle des Verkettungsoperators verwenden?

den Verkettungsoperator verwenden:

var newString = "The answer is '" + value + "'."; 

String.Format Verwendung:

var newString = String.Format("The answer is '{0}'.", value); 

String.Concat Verwendung:

var newString = String.Concat("The answer is '", value, "'."); 

Was sind die Vor- und Nachteile jeder dieser Methoden? Wann sollte ich einen über den anderen bevorzugen?

Die Frage entsteht aufgrund einer Debatte zwischen Entwicklern. One nie verwendet String.Format für die Verkettung - er argumentiert, dass dies für die Formatierung von Zeichenfolgen, nicht für die Verkettung, und das ist immer unlesbar, weil die Elemente in der Zeichenfolge in der falschen Reihenfolge ausgedrückt werden. Der andere häufig verwendet String.Format für die Verkettung, weil er denkt, dass es den Code leichter zu lesen macht, besonders wenn es mehrere Sätze von Zitaten gibt. Beide Entwickler verwenden auch den Verkettungsoperator und String.Builder.

Antwort

16

In Bezug auf Geschwindigkeit es fast immer doesn't matter.

var answer = "Use what makes " + "the code most easy " + "to read"; 
+0

+1 um dem unverdienten Downvote entgegenzuwirken. – LukeH

+0

Ja, guter Link +1. – StuartLC

+4

Die Verwendung von String-Verkettung würde oft viele kleine Objekte im Speicher erzeugen, was sich negativ auf die Speicherbereinigungsleistung auswirken könnte. Es ist sehr schwierig, einen solchen Effekt durch einen Test von Ihrem Link aus zu messen, aber es könnte ein sehr großes Leistungsproblem für große Systeme mit harten Leistungsanforderungen sein. –

2

Leistungsaspekte sind häufig der Grund für diese Entscheidung. Siehe this Artikel von Ayende.

0

Es ist nicht zu empfehlen Zeichenfolge in Code zu speichern, so, wenn Sie Ihre Strings aus Code zu extrahieren entscheiden, dann mit String.Format wäre es einfacher,

+1

Warum nicht? Ich weiß es zu schätzen, dass dies ein Problem sein kann, wenn Sie mit Internationalisierung rechnen, aber für viele Apps ist dies kein Thema. – Kramii

+0

Sag niemals nie :) –

3

ich in der Regel string.Format verwenden zu tun, wenn ich Verkettung von mehr als 2 oder 3 Werten, da es einfacher zu sehen ist, wie das Endergebnis aussehen würde. Die Verkettung der Zeichenfolgen ist langsam, da Sie für jede Operation ein neues Zeichenfolgenobjekt erstellen müssen.

Wenn Sie mehr als 5 Zeichenfolgen verbinden möchten, verwenden Sie StringBuilder, da es viel schneller wäre.

+1

Ich schlage vor String.Concat verwendet StringBuilder also denke ich, dass Performance-Argument schlägt hier fehl –

+1

In der Tat. Wenn das Argument die relative Leistung von 'Concat' und' Format' ist, dann wird 'Concat' jedes Mal gewinnen, es sei denn, Sie machen etwas Wahnsinniges. – LukeH

3

Ich gehe normalerweise für Lesbarkeit, und würde dazu neigen, Format zu verwenden. Der meiste Code wird einmal geschrieben und mehrmals gelesen, so dass der Leser schnell verstehen kann, was gesagt wurde, ist wichtiger (für mich).

3

Es ist seltsam, aber String.Format intern verwenden StringBuilder.AppendFormat(). Zum Beispiel wird String.Format Code aussehen wie:

public static string Format(IFormatProvider provider, string format, params object[] args) 
{ 
    if (format == null || args == null) 
    throw new ArgumentNullException((format == null ? "format" : "args")); 

    StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8)); 
    builder.AppendFormat(provider, format, args); 
    return builder.ToString(); 
} 

Mehr über dieses Sie here finden. Also, warum haben wir hier nicht über StringBuilder.AppendFormat() erwähnt!

Bezug zum Hauptpunkt der Frage:

Der Schlüssel ist das beste Werkzeug für den Job zu holen. Was meine ich?Betrachten Sie diese ehrfürchtigen Worte der Weisheit:

* Concatenate (+) is best at concatenating. 
* StringBuilder is best when you need to building. 
* Format is best at formatting. 
0

Dies ist ein Artikel über die Speichernutzung für verschiedene Verkettung Methoden und Compiler-Optimierungen verwendet, um den IL zu erzeugen. Concatenation methods and optimization issue

+1

Es ist in Ordnung, auf den Artikel zu verlinken, aber es ist besser, ausgewählte Informationen herauszuziehen und hier zu posten. Wenn dieser Blog weggeht/eines Tages verschoben wird, wird dies nutzlos. – Mike

Verwandte Themen