2008-10-22 7 views

Répondre

89

Vous pouvez utiliser .ToString() pour obtenir le String du StringBuilder.

8

Une fois que vous avez terminé le traitement à l'aide de StringBuilder, utilisez la méthode ToString pour renvoyer le résultat final.

De MSDN:

using System; 
using System.Text; 

public sealed class App 
{ 
    static void Main() 
    { 
     // Create a StringBuilder that expects to hold 50 characters. 
     // Initialize the StringBuilder with "ABC". 
     StringBuilder sb = new StringBuilder("ABC", 50); 

     // Append three characters (D, E, and F) to the end of the StringBuilder. 
     sb.Append(new char[] { 'D', 'E', 'F' }); 

     // Append a format string to the end of the StringBuilder. 
     sb.AppendFormat("GHI{0}{1}", 'J', 'k'); 

     // Display the number of characters in the StringBuilder and its string. 
     Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString()); 

     // Insert a string at the beginning of the StringBuilder. 
     sb.Insert(0, "Alphabet: "); 

     // Replace all lowercase k's with uppercase K's. 
     sb.Replace('k', 'K'); 

     // Display the number of characters in the StringBuilder and its string. 
     Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString()); 
    } 
} 

// This code produces the following output. 
// 
// 11 chars: ABCDEFGHIJk 
// 21 chars: Alphabet: ABCDEFGHIJK 
3

Je voudrais juste jeter que ce n'est pas nécessairement plus rapide, il aura certainement une meilleure empreinte mémoire. C'est parce que les chaînes sont immuables dans .NET et chaque fois que vous changez une chaîne, vous en avez créé une nouvelle.

1

La concaténation n'est pas plus rapide - Comme smaclell l'a souligné, le problème est la chaîne immuable qui impose une allocation et une recopie supplémentaires des données existantes.

« a » + « b » + « c » est pas plus rapide à faire avec le constructeur de chaîne, mais concats répété avec une chaîne intermédiaire devient plus rapide et plus rapide que le nombre de ce concat grossit comme:

x = "une"; x + = "b"; x + = "c"; ...

1

A propos étant plus rapide/meilleure mémoire:

J'ai regardé dans cette question avec Java, je suppose que .NET serait aussi intelligent à ce sujet.

L'implémentation de String est assez impressionnante.

L'objet String pistes « longueur » et « partagée » (indépendante de la longueur du tableau qui contient la chaîne)

donc quelque chose comme

String a = "abc" + "def" + "ghi"; 

peut être mis en œuvre (par le compilateur/exécution) comme:

 
- Extend the array holding "abc" by 6 additional spaces. 
- Copy def in right after abc 
- copy ghi in after def. 
- give a pointer to the "abc" string to a 
- leave abc's length at 3, set a's length to 9 
- set the shared flag in both. 

comme la plupart des chaînes sont de courte durée, ce qui rend pour un code très efficace dans de nombreux cas. le cas où il est absolument pas efficace est quand vous ajoutez à une chaîne dans une boucle, ou lorsque votre code est comme ceci:

a = "abc"; 
a = a + "def"; 
a += "ghi"; 

Dans ce cas, vous êtes beaucoup mieux à l'aide d'une construction StringBuilder. Mon point est que vous devez faire attention quand vous optimisez, à moins que vous soyez absolument sûr que vous savez ce que vous faites, ET vous êtes absolument sûr que c'est nécessaire, ET vous testez pour vous assurer que le code optimisé rend un cas d'utilisation , il suffit de le coder de la manière la plus lisible possible et n'essayez pas de surpasser le compilateur. J'ai perdu 3 jours à jouer avec des chaînes, à mettre en cache/réutiliser des chaînes de caractères et à tester la vitesse avant de regarder le code source des chaînes et de comprendre que le compilateur le faisait déjà mieux que je le pourrais.Ensuite, je devais expliquer comment je ne savais vraiment pas ce que je faisais, je pensais seulement que je l'ai fait ...

11

Quand vous dites "il est plus rapide de concaténer String avec un constructeur String", ce n'est vrai que si vous sont à plusieurs reprises (Je répète - à plusieurs reprises) concaténant au même objet.

Si vous êtes en train de concaténer 2 chaînes et que vous faites quelque chose avec le résultat immédiatement comme string, cela ne sert à rien d'utiliser StringBuilder.

Je viens de tombé sur belle écriture de Jon Skeet en ceci: http://www.yoda.arachsys.com/csharp/stringbuilder.html

Si vous utilisez StringBuilder, puis pour obtenir le résultat string, il est juste une question d'appeler ToString() (sans surprise).

Questions connexes