Constructor de cadenas

Constructor de cadenas

# Qué es un StringBuilder y cuándo usarlo

Un StringBuilder representa una serie de caracteres que, a diferencia de una cadena normal, son mutables. Muchas veces es necesario modificar 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, se debe crear, copiar y luego reasignar un nuevo objeto de cadena.

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 cadena debe hacer internamente implica:

  • Crear una nueva matriz de caracteres igual a la longitud de myString y la nueva cadena que estamos agregando.
  • Copiando todos los caracteres de myString al principio de nuestra nueva matriz y copiando la nueva cadena al final de la matriz.
  • Cree un nuevo objeto de cadena en la memoria y reasígnelo a myString .

Para una sola concatenación, esto es relativamente trivial. Sin embargo, ¿qué pasa 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 usando 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 con una cadena normal. Para hacer el StringBuilder de vuelta a una cadena normal, simplemente podemos llamar al ToString() método de StringBuilder .

Sin embargo, esta no es la única optimización StringBuilder posee. 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 nuestro StringBuilder necesita ser, podemos especificar su tamaño con anticipación, lo que evitará que necesite cambiar el tamaño de la matriz de caracteres que tiene internamente.

sb.Append('k', 2000);

Aunque usando StringBuilder para agregar 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 ToString() método en el StringBuilder para convertirlo a un string básico . Esto suele ser necesario porque el StringBuilder la clase no hereda de string .

Por ejemplo, así es como puedes usar un StringBuilder para crear un 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 usarse en lugar de una cadena cuando se deben realizar muchas modificaciones a una cadena teniendo en cuenta el rendimiento.

# Use 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();
}


No