Buscar..


Qué es un StringBuilder y cuándo usar uno

Un StringBuilder representa una serie de caracteres que, a diferencia de una cadena normal, son mutables. Muchas veces es necesario modificar las cadenas que ya hemos creado, pero el objeto de cadena estándar no es mutable. Esto significa que cada vez que se modifica una cadena, un nuevo objeto de cadena debe crearse, copiarse y luego reasignarse.

string myString = "Apples";
mystring += " are my favorite fruit";

En el ejemplo anterior, myString inicialmente solo tiene el valor "Apples" . Sin embargo, cuando concatenamos "son mi fruta favorita", lo que la clase de cuerdas necesita hacer internamente implica:

  • Creando una nueva matriz de caracteres igual a la longitud de myString y la nueva cadena que estamos agregando.
  • Copiando todos los caracteres de myString en el comienzo de nuestra nueva matriz y copiando la nueva cadena en el final de la matriz.
  • Cree un nuevo objeto de cadena en la memoria y myString a myString a myString .

Para una sola concatenación, esto es relativamente trivial. Sin embargo, ¿qué sucede si es necesario realizar muchas operaciones de adición, por ejemplo, en un bucle?

String myString = "";
for (int i = 0; i < 10000; i++)
    myString += " "; // puts 10,000 spaces into our string

Debido a la copia repetida y la creación de objetos, esto degradará significativamente el rendimiento de nuestro programa. Podemos evitar esto utilizando en su lugar un StringBuilder .

StringBuilder myStringBuilder = new StringBuilder();    
for (int i = 0; i < 10000; i++)
    myStringBuilder.Append(' ');

Ahora, cuando se ejecuta el mismo bucle, el rendimiento y la velocidad del tiempo de ejecución del programa serán significativamente más rápidos que usar una cadena normal. Para hacer que StringBuilder vuelva a ser una cadena normal, simplemente podemos llamar al método ToString() de StringBuilder .


Sin embargo, esta no es la única optimización que tiene StringBuilder . Para optimizar aún más las funciones, podemos aprovechar otras propiedades que ayudan a mejorar el rendimiento.

StringBuilder sb = new StringBuilder(10000); // initializes the capacity to 10000

Si sabemos de antemano cuánto tiempo debe StringBuilder nuestro StringBuilder , podemos especificar su tamaño antes de tiempo, lo que evitará que tenga que cambiar el tamaño de la matriz de caracteres que tiene internamente.

sb.Append('k', 2000);

Aunque el uso de StringBuilder para añadir es mucho más rápido que una cadena, puede ejecutarse incluso más rápido si solo necesita agregar un solo carácter muchas veces.

Una vez que haya completado la construcción de su cadena, puede usar el método ToString() en el StringBuilder para convertirla en una string básica. Esto suele ser necesario porque la clase StringBuilder no hereda de la string .

Por ejemplo, aquí es cómo puede usar un StringBuilder para crear una string :

string RepeatCharacterTimes(char character, int times)
{
    StringBuilder builder = new StringBuilder("");
    for (int counter = 0; counter < times; counter++)
    {
        //Append one instance of the character to the StringBuilder.
        builder.Append(character);
    }
    //Convert the result to string and return it.
    return builder.ToString();
}

En conclusión, StringBuilder debe usar en lugar de una cadena cuando se deben hacer muchas modificaciones a una cadena teniendo en cuenta el rendimiento.

Utilice StringBuilder para crear cadenas a partir de una gran cantidad de registros

public string GetCustomerNamesCsv()
{
    List<CustomerData> customerDataRecords = GetCustomerData(); // Returns a large number of records, say, 10000+

    StringBuilder customerNamesCsv = new StringBuilder();
    foreach (CustomerData record in customerDataRecords)
    {
       customerNamesCsv
           .Append(record.LastName)
           .Append(',')
           .Append(record.FirstName)
           .Append(Environment.NewLine);
    }

    return customerNamesCsv.ToString();
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow