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(); /* ... */ }
5 Réponses :
Utilisation de String + Object CODE> oblige un appel à ToString () sur l'objet - c'est équivalent à l'appeler explicitement. P>
@Aviad: Il y a une différence de synchronisation, cependant - qui affecte si la valeur est en boîte ou non.
J'utiliserais .Tostring () hors d'habitude et de lisibilité, je suis sûr que vous trouverez de meilleures performances sauvegardées ailleurs. P>
Ainsi, par exemple: est compilé dans: p> + code> Concaténation utilise
string.concat code> de toute façon -
string code> n'expose pas l'opérateur A +.
int i = 10;
object o1 = "hello";
object o2 = i; // Note boxing
string x = string.Concat(o1, o2);
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 code> ne lancera pas même si
obj code> est une référence null. Mais
"bonjour" + obj.tostring () code> va lancer si
obj code> est null, bien sûr. Cependant, même avec des types de référence, le style avec explicite
.tostring () code> pourrait être théoriquement plus rapide (lorsque
obj code> est non null) car il utilise le
concat (chaîne , string) code> surcharge au lieu de la concision
(objet, objet) code> surcharge.
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. P> S1: 15: deux plus trois est 23 P> S2: 15: deux plus trois est 5 P> P>
Comme déjà mentionné par Jon Skeet, le point sur la boxe est très important! p>
Si vous utilisez explicitement tostring () em> 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. P>
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 () em>. p>
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 () code> utilise la culture actuelle. Si vous souhaitez une conversion indépendante de la culture, vous devez utiliser
Tostring (cultureInfo.invarianTculture) code> (c'est plus important lors de la gestion des numéros de points flottants qu'avec des entiers).