net how c# string stringbuilder

c# - how - StringBuilder: ¿cómo obtener la cadena final?



stringbuilder net (6)

Alguien me dijo que es más rápido concatenar cadenas con StringBuilder. He cambiado mi código pero no veo ninguna propiedad o método para obtener la cadena final de compilación.

¿Cómo puedo obtener la cadena?


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

Analicé este problema con Java, supongo que .NET sería tan inteligente al respecto.

La implementación de String es bastante impresionante.

El objeto String rastrea "length" y "shared" (independientemente de la longitud de la matriz que contiene la cadena)

Así que algo así como

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

puede ser implementado (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 hace que en algunos casos sea un código MUY eficiente. El caso donde NO es absolutamente eficiente es cuando agregas una cadena dentro de un ciclo, o cuando tu código es así:

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

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

Mi punto es que debes tener cuidado siempre que optimices, a menos que estés ABSOLUTAMENTE seguro de que sabes lo que estás haciendo, Y estás absolutamente seguro de que es necesario, Y pruebas para asegurarte de que el código optimizado hace que pase un caso de uso, simplemente codifícalo de la manera más legible posible y no intentes dejar de pensar en el compilador.

Perdí 3 días jugando con cadenas de caracteres, 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 de lo que podía para mi caso de uso. Luego tuve que explicar cómo REALMENTE no sabía lo que estaba haciendo, solo pensé que lo hice ...


Cuando dice "es más rápido concatenar cadena con un generador de cadenas", esto solo es cierto si repetidamente (lo repito, repetidamente ) se concatena al mismo objeto.

Si solo está concatenando 2 cadenas y haciendo algo con el resultado inmediatamente como una string , no tiene sentido usar StringBuilder .

Acabo de tropezar con la buena escritura de Jon Skeet sobre esto: http://www.yoda.arachsys.com/csharp/stringbuilder.html

Si está usando StringBuilder , para obtener la string resultante, solo es cuestión de llamar a ToString() (como era de esperar).


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.


No es más rápido concat: como señaló smaclell, el problema es la cadena inmutable que obliga a una asignación adicional y la recopilación de datos existentes.

"a" + "b" + "c" no es más rápido que hacer con el generador de cadenas, pero los concats repetidos con una cadena intermedia se hacen cada vez más rápidos a medida que el número de concat se hace más grande como:

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


Una vez que haya completado el procesamiento utilizando StringBuilder, use el método ToString para devolver el resultado final.

Desde 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


Puede usar .ToString() para obtener la String de StringBuilder .