StringBuilder a la réputation d'être un outil de manipulation de chaînes plus rapide que la simple concaténation de chaînes. Que ce soit vrai ou non, je me pose des questions sur les résultats des opérations de StringBuilder et les chaînes qu'ils produisent. Une petite balade dans Reflector montre que StringBuilder.ToString() ne renvoie pas toujours une copie, parfois il semble renvoyer une instance de la chaîne interne. Il semble également utiliser certaines fonctions internes pour manipuler les chaînes internes.Les chaînes StringBuilder sont-elles immuables?
Alors qu'est-ce que je reçois si je fais cela?
string s = "Yo Ho Ho";
StringBuilder sb = new StringBuilder(s);
string newString = sb.ToString();
sb.Append(" and a bottle of rum.");
string newNewString = sb.ToString();
sont-nouvelleChaine et newNewString différentes instances de chaîne ou le même? J'ai essayé de comprendre cela par réflecteur, et je ne comprends tout simplement pas tout.
Que diriez-vous de ce code?
StringBuilder sb = new StringBuilder("Foo\n");
StringReader sr = new StringReader(sb.ToString());
string s = sr.ReadLine();
sb.Append("Bar\n");
s = sr.ReadLine();
La dernière instruction renverra-t-elle la valeur null ou "Bar"? Et s'il renvoie l'un ou l'autre, ce comportement est-il défini ou indéfini? En d'autres termes, puis-je m'en remettre?
La documentation est remarquablement laconique sur ce sujet, et je suis réticent à me fier au comportement observé plutôt qu'aux spécifications.
Veuillez noter que l'implémentation de StringBuilder a changé depuis que cette question a été posée et répondue. – mayu