2011-08-15 4 views
2

Tous,Considérations sur les performances pour cordes et StringBuilder - C#

Pour la chaîne string s = "abcd", ne string w = s.SubString(2) retourner un nouveau attribué objet String à savoir string w = new String ("cd") interne ou une chaîne de caractères? Pour StringBuilder, lors de l'ajout de valeurs de chaîne et si la taille de StringBuilder doit être augmentée, tous les contenus sont copiés dans un nouvel emplacement de mémoire ou simplement les pointeurs de chaque valeur de chaîne précédente sont réaffectés au nouveau emplacement?

Répondre

5

StringString est immuable, donc toute opération qui "change" la chaîne retournera en effet un new string. Cela inclut SubString et toutes les autres opérations sur String, y compris celles qui ne changent pas la longueur (telle que ToLower() ou similaire).

StringBuilder contient en interne une liste chaînée de blocs de caractères. Quand il doit grandir, un nouveau morceau est alloué et inséré à la fin de la liste, et les données sont copiées ici. En d'autres termes, tout le tampon StringBuilder ne sera pas copié sur un append, seulement les données que vous ajoutez. J'ai revérifié cela par rapport aux sources de référence de Framework 4.

+0

Merci pour votre réponse. En fait, ma question était plus de si String.Substring() retourne 'new String (XXXX)' ou simplement '" XXXX "'. Vous avez ma réponse si –

+0

Ce sera toujours un nouvel objet. En fait (tant qu'il n'y a pas de constantes de cordes ou de chaînes internes), il est inutile de parler d'une différence entre le retour de '' new String (XXXX) 'ou' "XXXX" ' – driis

+0

Pouvez-vous me guider? sources de référence dont vous parlez? –

1

For the string string s = "abcd", does string w = s.SubString(2) return a new allocated String object?Oui

For StringBuilder, when appending string values and if the size of the StringBuilder needs to be increased, are all the contents copied over to a new memory location?Oui

Tout changement dans les résultats cordes petits ou grands dans une nouvelle chaîne

+0

En fait, tout le contenu existant n'est pas copié dans un nouveau tampon lorsque plus d'espace est nécessaire. (Cela a été vérifié par rapport aux sources de référence de Framework 4.0). – driis

+0

@driis: MSDN dit 'Un objet StringBuilder maintient un tampon pour prendre en charge la concaténation de nouvelles données. Les nouvelles données sont ajoutées à la fin du tampon si la pièce est disponible; ** sinon, un nouveau tampon plus grand est alloué, les données du tampon d'origine sont copiées dans le nouveau tampon, puis les nouvelles données sont ajoutées au nouveau tampon **. Cela ne signifie-t-il pas que toutes les données existantes sont copiées? au nouveau tampon? –

0

Les chaînes sont des objets immuables de sorte que chaque fois que vous deviez apporter des modifications que vous créez une nouvelle instance de cette chaîne. La méthode de sous-chaîne ne modifie pas la valeur de la chaîne d'origine.

Cordialement.

+0

Merci pour votre réponse. En fait, ma question était plus de si String.Substring() retourne 'new String (XXXX)' ou simplement '" XXXX "'. Vous avez ma réponse si –

+0

Oui, même avec la méthode SubString, vous avez un nouvel objet sur le tas: ce sont des types de référence et non des types divalore, comme des variables, par exemple des structures. –

0

Si vous souhaitez effectuer un grand nombre de modifications sur une chaîne, il est préférable de le faire via StringBuilder.

De MSDN:

Vous pouvez utiliser la classe StringBuilder au lieu de la classe String pour les opérations qui font plusieurs modifications à la valeur d'une chaîne. Contrairement aux instances de la classe String, les objets StringBuilder sont mutables; Lorsque vous concaténez, ajoutez ou supprimez des sous-chaînes d'une chaîne, les opérations sont effectuées sur une seule chaîne.

Questions connexes