web-dev-qa-db-fra.com

string.format avec variables vs variables en ligne

Quels sont les avantages/inconvénients (le cas échéant) de l'utilisation

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

versus

string output; 
int i = 10;
output = "the int is " + i;

J'ai toujours utilisé ce dernier exemple, mais il semble que la bonne majorité des didacticiels en ligne utilisent l'exemple string.format. Je ne pense pas qu'il y ait de réelles différences en termes d'efficacité, ma pensée initiale est donc qu'un codeur n'a pas à continuer de casser la chaîne pour insérer des variables.

9
Jim

Si vous considérez que la traduction est importante dans votre projet, la première syntaxe vous aidera vraiment.

Par exemple, vous pouvez avoir:

static final string output_en = "{0} is {1} years old.";
static final string output_fr = "{0} a {1} ans.";

int age = 10;
string name = "Henri";
System.out.println(string.Format(output_en, name, age));
System.out.println(string.Format(output_fr, name, age));

Notez également que vos variables peuvent ne pas toujours être au même endroit dans la phrase avec cette syntaxe:

static final string output_yoda = "{1} years {0} has.";
22
Alex Garcia

Découvrez la première réponse pour https://stackoverflow.com/questions/4671610/why-use-string-format . Il couvre tout à mon avis pour savoir pourquoi c'est mieux.

En outre, chaque assemblage .NET possède un pool interne, contenant une collection de chaînes uniques. Lorsque votre code est compilé, tous les littéraux de chaîne auxquels vous faites référence dans votre code sont ajoutés à ce pool. Si vous avez un code qui ressemble à ceci:

"the int is " + i + " and the double is " + d

Cela fait 2 cordes dans la piscine.

Si tu as:

"the int is {0} and the double is {1}"

Vous n'avez qu'une seule chaîne dans le pool.

Il est un peu plus compliqué de savoir quand les chaînes sont internées, et quand elles ne le sont pas parce que le compilateur a une certaine intelligence lors de la détection de chaînes qui peuvent ne pas avoir besoin d'être internées parfois ... Consultez par exemple cet article = qui donne un meilleur aperçu de cette question.

Edit: après avoir creusé un peu, j'ai rencontré une réponse intéressante à la question Quand est-il préférable d'utiliser String.Format vs la concaténation de chaînes? . En bref, l'auteur de la réponse avec +30 votes fait un argument convaincant en faveur de la concaténation de chaînes lorsque la localisation n'est pas impliquée.

8
Jalayn

Je préfère la première façon, car elle me permet de voir avec précision à quoi ressemblera la chaîne lors de la sortie. Il est très facile d'oublier d'ajouter un espace ou d'ajouter un espacement supplémentaire lorsque vous ajoutez simplement des chaînes.

Je suis sûr qu'il y a également un avantage en termes de performances à la première façon car il n'est pas nécessaire de créer les chaînes supplémentaires; mais ce n'est pas ma principale préoccupation.

4
John Kraft

En utilisant la première option, vous pouvez stocker une chaîne de format couramment utilisée et réduire la saisie nécessaire et faciliter la mise à jour de la chaîne partout où elle est utilisée. Fondamentalement, la première option permet d'implémenter facilement DRY. C'est aussi une syntaxe beaucoup plus agréable si plusieurs variables doivent être utilisées dans une chaîne, comme vous l'avez mentionné.

2
Ryathal

Je pense qu'avec string.Format() il est plus facile de voir quel sera exactement le résultat (donc vous n'avez pas de problèmes avec des espaces oubliés ou quelque chose comme ça), et c'est aussi plus facile à taper et à modifier.

Si vous voulez faire un formatage très simple, utiliser l'opérateur + Plus peut être plus facile, mais j'ai tendance à ne l'utiliser que lors de la concaténation de deux chaînes, pas plus.

Pour montrer comment string.Format() est plus facile à modifier, considérez que vous vouliez ajouter un point final à la fin de la phrase dans votre exemple: passer de string.Format("The int is {0}", i) à string.Format("The int is {0}.", i) n'est qu'un caractère. Mais passer de "the int is " + i À "the int is " + i + '.' Est bien plus.

Un autre avantage de string.Format() est qu'il vous permet de spécifier facilement le format à utiliser, comme string.Format("The int is 0x{0:X}.", i). Ceci est encore plus important lors du formatage de la date.

En ce qui concerne l'efficacité, string.Format() est très probablement plus lent que les concaténations de chaînes simples. Mais un code comme celui-ci n'est probablement pas sur un chemin chaud, donc cela n'a pas d'importance. Et si c'est le cas, vous feriez probablement mieux d'utiliser StringBuilder.

1
svick

Utilisez celui qui rend votre code le plus lisible. Ne vous inquiétez pas des performances.

Pour votre exemple ci-dessous, je préfère B car il est juste plus lisible. Mais les traductions linguistiques ci-dessus ont également un sens. Ne laissez personne vous forcer à utiliser string.Format, lisez plutôt et pointez vers l'excellent blog de Jeff Atwoods sur le The Sad Tragedy of Micro Optimizations Theater

UNE:

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

versus

B:

string output; 
int i = 10;
output = "the int is " + i;
1
Makach