Question

  

Possible en double:    chaîne vs StringBuilder

Je viens revisité quelques-uns des livres que j'ai utilisé pour ramasser VB.NET. Je ne suis pas sûr que j'ai dans ma tête, comprendre comment / ce que StringBuilder est.

Qu'est-ce que les conseils d'utilisation? Est-il préférable de l'utiliser si vous concaténez 2 chaînes ou 50?

Ou lorsque la longueur de chaîne totale est supérieure à 128 caractères?

Ou vous verrez un avantage de performance à chaque fois que vous l'utilisez pour ajouter des chaînes ensemble?

Dans ce cas, il est préférable d'utiliser une instance de StringBuilder pour construire une instruction SQL que string.format("Select * from x where y = {0}",1)?

Il est toujours m'a frappé en déclarant une autre variable et comprenant un espace de nom n'est pas bénéfique pour les petites chaînes concaténations, mais je ne suis pas sûr maintenant.

Désolé, beaucoup de documents vous dit ce qu'il faut utiliser, tout simplement pas ce qui est mieux.

Était-ce utile?

La solution

J'ai article sur ce sujet très. En résumé (copié à partir du bas de la page):

  • certainement utiliser StringBuilder lorsque vous concaténer dans une boucle non négligeable - surtout si vous ne savez pas sûr (au moment de la compilation) combien d'itérations vous allez faire à travers la boucle. Par exemple, la lecture d'un fichier un caractère à la fois, la construction d'une chaîne que vous allez en utilisant l'opérateur + = est potentiellement suicide de performance.
  • certainement utiliser l'opérateur de concaténation quand vous pouvez (lisiblement) préciser tout ce qui doit être concaténé dans une instruction. (Si vous avez un éventail de choses à concaténer, envisager d'appeler explicitement String.Concat -. Ou String.Join si vous avez besoin d'un delimiter)
  • Ne pas avoir peur de briser littéraux en plusieurs morceaux concaténés - le résultat sera le même. Vous pouvez faciliter la lecture en brisant un long littérale en plusieurs lignes, par exemple, sans nuire à la performance.
  • Si vous avez besoin des résultats intermédiaires de la concaténation pour autre chose que l'alimentation de la prochaine itération de concaténation, StringBuilder ne va pas vous aider. Par exemple, si vous construisez un nom complet d'un prénom et un nom de famille, puis ajouter un troisième élément d'information (le surnom, peut-être) à la fin, vous bénéficiez seulement d'utiliser StringBuilder si vous ne le besoin (prénom + nom) chaîne à d'autres fins (comme nous le faisons dans l'exemple qui crée un objet personne).
  • Si vous avez juste quelques concaténations à faire, et que vous voulez vraiment les faire dans des déclarations séparées, il ne compte pas vraiment dans quel sens vous allez. Quelle façon plus efficace dépendra du nombre de concaténations les tailles de chaîne impliqués, et dans quel ordre ils sont concaténés. Si vous croyez vraiment ce morceau de code pour être un goulot d'étranglement de performance, le profil ou le benchmark dans les deux sens.

Autres conseils

Voici ma règle:

  

StringBuilder est mieux utilisé lorsque le nombre exact de concaténations est inconnu au moment de la compilation.

codage Horror a un bon article sur cette question, La triste tragédie du théâtre Micro-optimisation .

Personnellement, j'utiliser StringBuilder quand j'ai plus d'une ou deux chaînes à concaténer. Je ne sais pas s'il y a une réelle performance due à gagner, mais je l'ai lu toujours et on m'a dit que faire un enchaînement régulier avec plusieurs chaînes crée une copie supplémentaire de la chaîne à chaque fois que vous le faites, tout en utilisant StringBuilder garde un copie jusqu'à ce que vous appelez la méthode ToString() finale sur elle.

Quelqu'un a compris expérimentalement que le nombre critique est 6. Plus de 6 concaténations de suite et vous devez utiliser un StringBuilder. Ne me souviens pas où je trouvais cela.

Toutefois, notez que si vous écrivez simplement ceci dans une ligne:

"qwert" + "yuiop" + "asdf" + "gh" + "jkl;" + "zxcv" + "bnm" + ",."

C'est converti en un appel de fonction (je ne sais pas comment l'écrire dans VB.net)

String.Concat("qwert", "yuiop", "asdf", "gh", "jkl;", "zxcv", "bnm", ",.");

Donc, si vous faites tous les concaténations sur une ligne, alors ne vous embêtez pas avec StringBuilder parce que String.Concat aura pour effet de faire toutes les concaténations en une seule fois. Il est seulement si vous les faites dans une boucle ou successivement concaténer.

Ma règle -. Quand vous ajoutez à une chaîne dans une boucle Pour ou Foreach, utilisez le StringBuilder

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top