Zeichenfolgenverkettung mit dem Operator '+'

86

Wenn stringich mir die Klassenmetadaten ansehe, sehe ich nur die Operatoren ==und bin !=überladen. Wie kann es also eine Verkettung für den +Operator ' ' durchführen?

Bearbeiten :

Einige interessante Anmerkungen von Eric Lippert zur Verkettung von Zeichenfolgen:

Teil 1

Teil 2

Es gibt auch einen Superartikel von Joel, auf den in Teil 2 verwiesen wird ( http://www.joelonsoftware.com/articles/fog0000000319.html ).

NoviceProgrammer
quelle

Antworten:

143

Das tut es nicht - der C # -Compiler tut es :)

Also dieser Code:

string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;

wird tatsächlich kompiliert als:

string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);

(Gah - intervenierende Bearbeitung hat versehentlich andere Bits entfernt.)

Der Vorteil des C # -Compilers, der feststellt, dass es hier mehrere Zeichenfolgenverkettungen gibt, besteht darin, dass Sie am Ende keine Zwischenzeichenfolge erstellen, x + ydie dann im Rahmen der Verkettung von (x + y)und erneut kopiert werden muss z. Stattdessen erledigen wir alles auf einmal.

BEARBEITEN: Beachten Sie, dass der Compiler nichts tun kann, wenn Sie in einer Schleife verketten. Zum Beispiel dieser Code:

string x = "";
foreach (string y in strings)
{
    x += y;
}

endet nur als äquivalent zu:

string x = "";
foreach (string y in strings)
{
    x = string.Concat(x, y);
}

... das erzeugt also viel Müll, und deshalb sollten Sie in StringBuildersolchen Fällen ein verwenden. Ich habe einen Artikel, der ausführlicher auf die beiden eingeht und hoffentlich weitere Fragen beantwortet.

Jon Skeet
quelle
8
Gute Antwort; Nur eine Folgefrage: Wenn Sie Zeichenfolgen innerhalb einer Schleife verketten, wie funktioniert der Compiler mit dem Operator .Concat, wenn er nicht im Voraus wissen kann, was sich in der Schleife befinden wird.
Frenchie
Ah ok! Und deshalb ist es besser, den StringBuilder für Verkettungen zu verwenden?
Frenchie
4
@frenchie: Deshalb ist es besser, StringBuilder für die wiederholte Verkettung zu verwenden ... aber warum lohnt es sich nicht, eine feste Anzahl von Werten zu verketten .
Jon Skeet
@ Jon-Skeet: Danke für die schnelle Klarstellung ... ich hätte auch in IL einchecken sollen ... und so fügt int auch hinzu? durch Aufrufen der Add-Methode?
NoviceProgrammer
2
Beachten Sie jedoch, dass die Methoden string.Concatund heutzutage string.Joinviele Überladungen aufweisen, einschließlich einiger IEnumerable<>Instanzen in einer Instanz. Daher sind sie in den meisten Fällen bequemer zu verwenden als a StringBuilder(ich weiß nicht, ob diese Methoden StringBuilderintern eine verwenden, ich sage nur, dass sie in den meisten Fällen bequemer sind).
Jeppe Stig Nielsen