2008-10-22 6 views

Respuesta

89

Se puede utilizar para obtener el .ToString()String del StringBuilder.

8

Una vez que haya completado el procesamiento utilizando StringBuilder, use el método ToString para devolver el resultado 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

Me gustaría descartar que no necesariamente sea más rápido, definitivamente tendrá una mejor huella de memoria. Esto se debe a que las cadenas son inmutables en .NET y cada vez que cambias una cadena, creas una nueva.

1

No es más rápido de concat - Como señaló smaclell, el problema es la cadena inmutable forzando una asignación adicional y la recopilación de datos existentes.

"a" + "b" + "c" no más rápido tiene que ver con generador de cadenas, pero concats repite con una cadena intermedia se hace más rápido y más rápido como el # de concat de hace más grande como:

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

1

acerca de que sea más rápido/mejor memoria:

Miré en este tema con Java, .NET Asumo sería tan inteligente al respecto.

La implementación de String es bastante impresionante.

Las pistas de objetos String "longitud" y "compartida" (independiente de la longitud de la matriz que contiene la cadena)

así que algo como

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

se puede implementar (por el compilador/tiempo de ejecución) como:

 
- 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. 

como la mayoría de las cadenas son de corta duración, esto lo convierte en un código muy eficiente en muchos casos. El caso en el que es absolutamente no eficiente es cuando se agrega a una cadena dentro de un bucle, o cuando el código es así:

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

En este caso, es mucho mejor usar una construcción StringBuilder.

Mi punto es que debe tener cuidado cada vez que optimice, a menos que esté ABSOLUTAMENTE seguro de que sabe lo que está haciendo, Y está absolutamente seguro de que es necesario Y prueba para asegurarse de que el código optimizado haga pasar un caso de uso , simplemente codifíquelo de la manera más legible posible y no intente superar el compilador.

Perdí 3 días jugando con cadenas, almacenando en caché/reutilizando cadenas de compilación y probando la velocidad antes de mirar el código fuente de la cadena y descubrir que el compilador ya lo estaba haciendo mejor que mi caso de uso.Luego tuve que explicar cómo REALMENTE no sabía lo que estaba haciendo, solo pensé que lo hice ...

11

Cuando dices "es más rápido concatenar String con un generador de cadenas", esto solo es cierto si son repetidamente (repito - repetidamente) concatenando al mismo objeto.

Si concatenas 2 cadenas y haces algo con el resultado inmediatamente como string, no tiene sentido usar StringBuilder.

Me tropecé en buena escritura hasta de Jon Skeet de esto: http://www.yoda.arachsys.com/csharp/stringbuilder.html

Si está utilizando StringBuilder, a continuación, para obtener el string resultante, que es sólo una cuestión de llamar ToString() (como era de esperar).

Cuestiones relacionadas