Concatenazione di stringhe utilizzando l'operatore "+"


Risposte:


143

Non lo fa - il compilatore C # lo fa :)

Quindi questo codice:

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

viene effettivamente compilato come:

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

(Gah - la modifica intervenuta ha rimosso accidentalmente altri bit.)

Il vantaggio del compilatore C # che nota che ci sono più concatenazioni di stringhe qui è che non si finisce per creare una stringa intermedia di x + ycui è necessario copiare nuovamente come parte della concatenazione di (x + y)e z. Invece, facciamo tutto in una volta.

EDIT: nota che il compilatore non può fare nulla se ti concatena in un ciclo. Ad esempio, questo codice:

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

finisce solo come equivalente a:

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

... quindi questo fa generare un sacco di immondizia, ed è il motivo per cui si dovrebbe usare una StringBuilderper tali casi. Ho un articolo che approfondisce i dettagli sui due che si spera risponda ad ulteriori domande.


8
Buona risposta; solo una domanda di follow-up: se stai concatenando stringhe all'interno di un ciclo, come fa il compilatore a far funzionare l'operatore .Concat quando non può sapere in anticipo cosa ci sarà nel ciclo.
Frenchie

Ah ok! Ed è per questo che è meglio usare StringBuilder per le concatenazioni?
Frenchie

4
@frenchie: Ecco perché è meglio usare StringBuilder per concatenazioni ripetute ... ma perché non ne vale la pena per la concatenazione di un numero fisso di valori .
Jon Skeet

@ Jon-Skeet: grazie per il rapido chiarimento ... avrei dovuto fare il check-in anche in IL..e questo è il modo in cui anche int aggiunge? chiamando il metodo Add?
NoviceProgrammer

2
Ma si noti che oggigiorno i metodi string.Concate string.Joinhanno molti overload, inclusi alcuni che accettano IEnumerable<>un'istanza. Quindi sono più convenienti da usare nella maggior parte dei casi che usare a StringBuilder(non so se questi metodi usano StringBuilderinternamente a, dico solo che sono più convenienti nella maggior parte dei casi).
Jeppe Stig Nielsen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.