8
votes

Concaténation de chaîne avec ou sans .tostring ()?

J'ai une déclaration dans laquelle une chaîne est attribuée de la manière suivante:

for (int i = 0; i < x; i++) 
{
    Foo.MyStringProperty = "Bar_" + i.ToString();
    /* ... */
}


2 commentaires

Vous ne pouvez pas faire un test de test? Laissez-la en boucle de 10.000 fois, mesurez le temps et vous connaissez la réponse.


CAVEAT: Tostring () utilise la culture actuelle. Si vous souhaitez une conversion indépendante de la culture, vous devez utiliser Tostring (cultureInfo.invarianTculture) (c'est plus important lors de la gestion des numéros de points flottants qu'avec des entiers).


5 Réponses :


6
votes

Utilisation de String + Object oblige un appel à ToString () sur l'objet - c'est équivalent à l'appeler explicitement.


1 commentaires

@Aviad: Il y a une différence de synchronisation, cependant - qui affecte si la valeur est en boîte ou non.



0
votes

J'utiliserais .Tostring () hors d'habitude et de lisibilité, je suis sûr que vous trouverez de meilleures performances sauvegardées ailleurs.


0 commentaires

25
votes

+ code> Concaténation utilise string.concat code> de toute façon - string code> n'expose pas l'opérateur A +.

Ainsi, par exemple: xxx pré>

est compilé dans: p>

int i = 10;
object o1 = "hello";
object o2 = i; // Note boxing
string x = string.Concat(o1, o2);


3 commentaires

Merci, réponse très claire. Je serais tenté d'accepter le commentaire de Divo s'il s'agissait d'une réponse à la place, à cause de sa mise en garde contre les informations de la culture.


Dans mes tests, la boxe et la boîte de consigne d'un type de valeur lorsque vous n'utilisez pas la méthode de la totrage provoque environ 2,5% de performances.


Intéressant. Je pensais que le compilateur C # générerait peut-être le même IL dans les deux situations, mais vous avez raison, cela ne (pas avec C # 5). La situation avec un type de référence est un peu différente. Ici, le code "bonjour" + obj ne lancera pas même si obj est une référence null. Mais "bonjour" + obj.tostring () va lancer si obj est null, bien sûr. Cependant, même avec des types de référence, le style avec explicite .tostring () pourrait être théoriquement plus rapide (lorsque obj est non null) car il utilise le concat (chaîne , string) surcharge au lieu de la concision (objet, objet) surcharge.



2
votes

Tostring est la méthode par défaut utilisée pour écrire un objet. Donc, si vous utilisez "i" ou "i.tostring ()" est la même chose.

Si vous connaissez un peu sur la surcharge de l'opérateur en C ++, vous pouvez comprendre comment "+" fonctionne dans ce cas. xxx

résultat: MSG: L'âge est 10. super?

S1: 15: deux plus trois est 23

S2: 15: deux plus trois est 5


0 commentaires

0
votes

Comme déjà mentionné par Jon Skeet, le point sur la boxe est très important!

Si vous utilisez explicitement tostring () il n'y a pas de boxe, ce qui signifie qu'aucune boîte d'objet n'est créée autour de i. La boîte d'objet autour de je doit être jetée plus tard par le collecteur des ordures, provoquant une pénalité de performance.

Si vous ne le faites que quelques fois dans votre programme, cela n'a pas d'importance, mais si vous faites une boxe très souvent, vous devriez aller pour la version tostring () .


0 commentaires