Concaténation de chaînes à l'aide de l'opérateur '+'

86

En regardant les stringmétadonnées de classe, je ne vois que les opérateurs ==et !=surchargés. Alors, comment peut-il effectuer une concaténation pour l' +opérateur « »?

Modifier :

Quelques notes intéressantes d'Eric Lippert sur la concaténation de cordes:

Partie 1

Partie 2

Il y a aussi un super article de Joel mentionné dans la partie 2 ( http://www.joelonsoftware.com/articles/fog0000000319.html )

Programmeur novice
la source

Réponses:

143

Ce n'est pas le cas - le compilateur C # le fait :)

Donc ce code:

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

est en fait compilé comme:

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

(Gah - modification intermédiaire supprimée accidentellement d'autres bits.)

L'avantage du compilateur C # remarquant qu'il existe plusieurs concaténations de chaînes ici est que vous ne finissez pas par créer une chaîne intermédiaire x + ydont il faut ensuite copier à nouveau dans le cadre de la concaténation de (x + y)et z. Au lieu de cela, nous faisons tout cela en une seule fois.

EDIT: Notez que le compilateur ne peut rien faire si vous concaténez dans une boucle. Par exemple, ce code:

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

finit juste comme équivalent à:

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

... donc cela ne générer beaucoup d'ordures, et il est la raison pour laquelle vous devez utiliser un StringBuilderpour de tels cas. J'ai un article qui donne plus de détails sur les deux qui, espérons-le, répondra à d'autres questions.

Jon Skeet
la source
8
Bonne réponse; juste une question de suivi: si vous concaténez des chaînes dans une boucle, comment le compilateur fonctionne-t-il avec l'opérateur .Concat quand il ne peut pas savoir à l'avance ce qui va être dans la boucle.
frenchie
Ah ok! Et c'est pourquoi il est préférable d'utiliser le StringBuilder pour les concaténations?
frenchie
4
@frenchie: C'est pourquoi il est préférable d'utiliser StringBuilder pour la concaténation répétée ... mais pourquoi cela ne vaut pas la peine pour la concaténation d'un nombre fixe de valeurs .
Jon Skeet
@ Jon-Skeet: merci pour la clarification rapide ... j'aurais dû aussi vérifier dans IL..et c'est ainsi qu'int ajoute aussi? en appelant la méthode Add?
NoviceProgrammer
2
Mais notez que de nos jours, les méthodes string.Concatet string.Joinprésentent de nombreuses surcharges, dont certaines prennent une IEnumerable<>instance. Ils sont donc plus pratiques à utiliser dans la plupart des cas qu'à utiliser a StringBuilder(je ne sais pas si ces méthodes utilisent un en StringBuilderinterne, je dis juste qu'elles sont plus pratiques dans la plupart des cas).
Jeppe Stig Nielsen