int a = 1;
int b = 2;
int sum = a + b;
string expression = "Expression: " + a + " + " + b + " = " + sum;
Console.WriteLine(expression); //displays Expression 1 + 2 = 3
Dois-je utiliser:
string expression = "Expression: " + a + " + " + b + " = " + sum;
ou
string expression = "Expression: " + a.ToString() + " + " + b.ToString() + " = " + result.ToString();
Est-il recommandé d'utiliser ToString()
lors de la concaténation string
et int
?
a + "" + b + ""
ou"" + a + b + ""
, peu importe: tout est concaténation de chaînes. Ena + b + ""
cela importe:a
etb
sont ajoutés en premier."Expression: " + a
lancera une erreur de temps de compilation (avec Option Strict On),"Expression: " & a
effectuera la concaténation de chaîne.Réponses:
ToString
usageNon, vous ne devriez pas l'utiliser
ToString
ici.La concaténation de chaînes transforme automatiquement les non-chaînes en chaînes, ce qui signifie que vos deux variantes sont presque¹ identiques:
Source: Spécification du langage C #: opérateur d'addition, MSDN .
Par contre, le premier (sans
ToString
):Alors préférez le premier.
Sous la capuche
Ce qui est aussi intéressant, c'est de voir ce qui se passe sous le capot. Une des façons de le voir est de regarder le code IL dans LINQPad. Ce programme:
est traduit dans l'IL suivant:
Tu vois ça
System.String.Concat
? Cela signifie que le code d'origine peut également être écrit comme cela, ce qui se traduit exactement par le même IL:Lorsque vous lisez la documentation de
string.Concat(object[])
, vous pouvez apprendre que:Cela signifie que
ToString
c'est redondant. Aussi:Ce qui gère bien le cas où certains des opérandes sont nuls (voir la note de bas de page 1).
Alors que dans le dernier exemple, la concaténation a été traduite en
string.Concat
, il convient également de mettre en évidence les optimisations du compilateur:se traduit par:
D'autre part:
se traduit par:
Autres alternatives
Il existe bien sûr d'autres façons de concaténer des représentations de chaîne d'objets en C #.
StringBuilder
est utilisé lorsque vous devez effectuer de nombreuses opérations de concaténation et permet de réduire le nombre de chaînes intermédiaires créées. Décider si vous devez utiliser uneStringBuilder
concaténation ou une concaténation ordinaire peut ne pas être facile. Utilisez un profileur ou recherchez des réponses pertinentes sur Stack Overflow.L'utilisation
StringBuilder
a un inconvénient majeur de rendre le code difficile à lire et à maintenir. Pour des cas simples comme celui de votre question,StringBuilder
non seulement nuit à la lisibilité du code, mais aussi inutile en termes de performances.string.Join
doit être utilisé lorsque vous devez ajouter des délimiteurs.Évidemment, ne jamais utiliser
string.Join
avec un délimiteur vide pour concaténer des chaînes.string.Format
peut être utilisé lorsque le modèle de chaîne est préféré à la concaténation de chaîne. L'un des cas où vous préférerez peut-être que le message peut être localisé, comme suggéré dans la réponse de kunthet.L'utilisation
string.Format
présente plusieurs inconvénients, ce qui la rend inadaptée à des cas simples comme le vôtre:Avec de simples espaces réservés "{0}", il est souvent difficile de savoir quel paramètre va où. Il est fréquent d'inverser par erreur les paramètres ou d'en oublier un. Heureusement, C # 6 introduit enfin l' interpolation de chaînes qui résout ce problème.
Les performances d'exécution peuvent se dégrader. Bien sûr, ne présumez pas que
string.Format
c'est toujours plus lent. Si les performances sont importantes, mesurez deux approches et déterminez laquelle est la plus rapide en fonction de vos résultats réels au lieu d'hypothèses.Le code est légèrement plus long à écrire, plus long à lire et plus difficile à maintenir, bien que cela soit extrêmement mineur et ne devrait pas trop vous déranger.
¹ La différence apparaît lorsque l'un des objets l'est
null
. SansToString
, anull
est remplacé par une chaîne vide. AvecToString
, unNullReferenceException
est lancé.la source
+
est considérée comme une mauvaise pratique dans la plupart des langues. Dans ce casstring.Concat
, j'utiliserais , dans de nombreux cas,string.Format
c'est mieux. Ce n'est certainement pas Pythonic à utiliser+
, et puisque PEP 3101%
est également déconseilléstr.format
.null
vraiment une chaîne vide pour vraiment "la gérer correctement"? Eh bien, ce n'est pas aussi mauvais que "en cas d'erreur reprendre ensuite" ...Concat(object[])
sera utilisée à la place deConcat(string[])
. Donc,"string " + i
n'est pas réellement identique à"string " + i.ToString()
ToString()
: le code OP dans un cas,System.String.Concat
l'implémentation de dans l'autre cas. Donc, la réponse reste valable: n'écrivez pas le code qui n'a aucun avantage.Au lieu de cela, vous devez utiliser le formateur de chaînes. Il est plus facile de formater votre nombre en représentation sous forme de chaîne ou en localisation. par exemple:
Plus d'informations sur MSDN .
Cependant, le formateur de chaînes est moins lisible (et peut-être aussi les performances) que la concaténation de chaînes.
la source
Si vous utilisez la
+
concaténation, elle utilise elle-même laString.Concat
méthode. La chaîne elle-même n'expose pas d'opérateur +.par exemple:
est compilé en:
Si vous appelez directement
ToString
, cela évitera la boxe et appellera laConcat(string, string)
surcharge. Par conséquent, l'ToString
appel sera légèrement plus efficace mais pas suffisamment significatif. Vous feriez mieux d'aller avec l'exemple qui vous semble plus lisible.la source