Puisque je ne pense pas que les réponses ici couvrent tout, j'aimerais faire un petit ajout ici.
Console.WriteLine(string format, params object[] pars)
appels string.Format
. Le «+» implique la concaténation de chaînes. Je ne pense pas que cela ait toujours à voir avec le style; J'ai tendance à mélanger les deux styles en fonction du contexte dans lequel je suis.
Réponse courte
La décision à laquelle vous êtes confronté concerne l'allocation de chaînes. Je vais essayer de faire simple.
Dis que tu as
string s = a + "foo" + b;
Si vous exécutez ceci, il évaluera comme suit:
string tmp1 = a;
string tmp2 = "foo"
string tmp3 = concat(tmp1, tmp2);
string tmp4 = b;
string s = concat(tmp3, tmp4);
tmp
ici, ce n'est pas vraiment une variable locale, mais c'est une variable temporaire pour le JIT (elle est poussée sur la pile IL). Si vous poussez une chaîne sur la pile (telle queldstr
dans IL pour les littéraux), vous placez une référence à un pointeur de chaîne sur la pile.
Le moment où vous appelez concat
cette référence devient un problème, car il n'y a pas de référence de chaîne disponible contenant les deux chaînes. Cela signifie que .NET doit allouer un nouveau bloc de mémoire, puis le remplir avec les deux chaînes. La raison pour laquelle c'est un problème, c'est que l'attribution est relativement chère.
Ce qui change la question en: Comment pouvez-vous réduire le nombre d' concat
opérations?
Donc, la réponse approximative est: string.Format
pour> 1 concat, '+' fonctionnera très bien pour 1 concat. Et si vous ne vous souciez pas de faire des optimisations de micro-performances, string.Format
cela fonctionnera très bien dans le cas général.
Une note sur la culture
Et puis il y a quelque chose qui s'appelle la culture ...
string.Format
vous permet d'utiliser CultureInfo
dans votre mise en forme. Un simple opérateur «+» utilise la culture actuelle.
C'est particulièrement une remarque importante si vous écrivez des formats de fichiers et f.ex. double
les valeurs que vous «ajoutez» à une chaîne. Sur différentes machines, vous pourriez vous retrouver avec des chaînes différentes si vous ne l'utilisez pas string.Format
avec un fichier explicite CultureInfo
.
Par ex. considérez ce qui se passe si vous changez un '.' pour un ',' lors de l'écriture de votre fichier de valeurs séparées par des virgules ... en néerlandais, le séparateur décimal est une virgule, donc votre utilisateur pourrait juste avoir une 'drôle' surprise.
Réponse plus détaillée
Si vous ne connaissez pas la taille exacte de la chaîne au préalable, il est préférable d'utiliser une stratégie comme celle-ci pour surallouer les tampons que vous utilisez. L'espace libre est d'abord rempli, après quoi les données sont copiées.
Croître signifie allouer un nouveau bloc de mémoire et copier les anciennes données dans le nouveau tampon. L'ancien bloc de mémoire peut alors être libéré. Vous obtenez le résultat final à ce stade: la culture est une opération coûteuse.
Le moyen le plus pratique de procéder consiste à utiliser une politique de surutilisation. La politique la plus courante consiste à surallouer les tampons en puissances de 2. Bien sûr, vous devez le faire un peu plus intelligemment que cela (car cela n'a aucun sens de passer de 1,2,4,8 si vous savez déjà que vous avez besoin de 128 caractères ) Mais tu vois ce que je veux dire. La politique garantit que vous n'avez pas besoin d'un trop grand nombre des opérations coûteuses que j'ai décrites ci-dessus.
StringBuilder
est une classe qui surutilise essentiellement le tampon sous-jacent en puissances de deux. string.Format
utilise StringBuilder
sous le capot.
Cela fait de votre décision un compromis de base entre surallouer et ajouter (-multiple) (w / wo culture) ou simplement allouer et ajouter.
string.Format
qui n'utilise aucune fonctionnalité de formatage composite (c'est-à-dire simplement simple{0}
) et les remplace par la concaténation de chaînes considérablement plus rapide. Je me demande qu'un tel exploit est réalisable avec un réécriveur IL existant tel que PostSharp.