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 ).

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.