Utilizar la clase StringBuilder en .NET
El objeto String es inmutable. Cada vez que se usa uno de los métodos de la clase System.String, se crea un objeto de cadena en la memoria, lo que requiere una nueva asignación de espacio para ese objeto. En las situaciones en las que es necesario realizar modificaciones repetidas en una cadena, la sobrecarga asociada a la creación de un objeto String puede ser costosa. La clase System.Text.StringBuilder se puede usar para modificar una cadena sin crear un objeto. Por ejemplo, el uso de la clase StringBuilder puede mejorar el rendimiento al concatenar muchas cadenas en un bucle.
Importar el espacio de nombres System.Text
La clase StringBuilder se encuentra en el espacio de nombres System.Text. Para evitar tener que proporcionar un nombre de tipo completo en el código, se puede importar el espacio de nombres System.Text:
using namespace System;
using namespace System::Text;
using System;
using System.Text;
Imports System.Text
Crear instancias de un objeto StringBuilder
Para crear una instancia de la clase StringBuilder, inicialice la variable con uno de los métodos de constructor sobrecargado, como se muestra en el ejemplo siguiente.
StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
Dim myStringBuilder As New StringBuilder("Hello World!")
Configurar la capacidad y la longitud
Aunque StringBuilder es un objeto dinámico que permite expandir el número de caracteres de la cadena que encapsula, se puede especificar un valor para el número máximo de caracteres que puede contener. Este valor se conoce como la capacidad del objeto y no debe confundirse con la longitud de la cadena que el objeto StringBuilder actual contiene. Por ejemplo, puede crear una instancia de la clase StringBuilder con la cadena "Hello", que tiene una longitud de 5, y especificar que el objeto tiene una capacidad máxima de 25. Al modificar StringBuilder, este no reasigna el tamaño para sí mismo hasta que se alcanza la capacidad. Cuando esto sucede, el nuevo espacio se asigna automáticamente y se duplica la capacidad. La capacidad de la clase StringBuilder se puede especificar con uno de los constructores sobrecargados. En el ejemplo siguiente se especifica que el objeto myStringBuilder
se puede expandir hasta un máximo de 25 espacios.
StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!", 25);
StringBuilder myStringBuilder = new StringBuilder("Hello World!", 25);
Dim myStringBuilder As New StringBuilder("Hello World!", 25)
Además, se puede usar la propiedad de lectura y escritura Capacity para establecer la longitud máxima del objeto. En el ejemplo siguiente se usa la propiedad Capacity para definir la longitud máxima del objeto.
myStringBuilder->Capacity = 25;
myStringBuilder.Capacity = 25;
myStringBuilder.Capacity = 25
El método EnsureCapacity se puede usar para comprobar la capacidad del objeto StringBuilder actual. Si la capacidad es mayor que el valor transmitido, no se realiza ningún cambio, pero si es menor que este, la capacidad actual se cambia para que coincida con el valor en cuestión.
También se puede ver o establecer la propiedad Length. Si la propiedad Length se establece en un valor mayor que el de la propiedad Capacity, la propiedad Capacity se cambia automáticamente al mismo valor de la propiedad Length. Si la propiedad Length se establece en un valor menor que la longitud de la cadena de StringBuilder actual, se acorta la cadena.
Modificar la cadena StringBuilder
En la tabla siguiente se enumeran los métodos que se pueden usar para modificar el contenido de StringBuilder.
Nombre del método | Usar |
---|---|
StringBuilder.Append | Anexa información al final del objeto StringBuilder actual. |
StringBuilder.AppendFormat | Reemplaza a un especificador de formato que se pasa en una cadena con texto con formato |
StringBuilder.Insert | Inserta una cadena o un objeto en el índice especificado del elemento StringBuilder actual. |
StringBuilder.Remove | Quita el número de caracteres especificado del objeto StringBuilder actual. |
StringBuilder.Replace | Reemplaza todas las apariciones de un carácter o cadena especificados en la instancia de StringBuilder por otro carácter o cadena especificados. |
Anexar
El método Append se puede usar para agregar texto o la representación de cadena de un objeto al final de una cadena representada por el objeto StringBuilder actual. En el ejemplo siguiente, se inicializa StringBuilder en "Hello World" y, después, se anexa texto al final del objeto. El espacio se asigna automáticamente según sea necesario.
StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Append(" What a beautiful day.");
Console::WriteLine(myStringBuilder);
// The example displays the following output:
// Hello World! What a beautiful day.
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Append(" What a beautiful day.");
Console.WriteLine(myStringBuilder);
// The example displays the following output:
// Hello World! What a beautiful day.
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Append(" What a beautiful day.")
Console.WriteLine(myStringBuilder)
' The example displays the following output:
' Hello World! What a beautiful day.
AppendFormat
El método StringBuilder.AppendFormat agrega texto al final del objeto StringBuilder. Admite la característica de formatos compuestos (para obtener más información, consulte Formatos compuestos) mediante la llamada a la implementación de IFormattable del objeto u objetos a los que se va a dar formato. Por tanto, acepta las cadenas de formato estándar para valores numéricos, de fecha y hora y de enumeración; las cadenas de formato personalizado para valores numéricos y de fecha y hora; y las cadenas de formato definidas para los tipos personalizados. (Para obtener información acerca del formato, consulte Aplicar formato a tipos.) Este método se puede usar para personalizar el formato de las variables y anexar esos valores a StringBuilder. En el ejemplo siguiente se usa el método AppendFormat para colocar un valor entero con formato de valor de divisa al final de un objeto StringBuilder.
int MyInt = 25;
StringBuilder^ myStringBuilder = gcnew StringBuilder("Your total is ");
myStringBuilder->AppendFormat("{0:C} ", MyInt);
Console::WriteLine(myStringBuilder);
// The example displays the following output:
// Your total is $25.00
int MyInt = 25;
StringBuilder myStringBuilder = new StringBuilder("Your total is ");
myStringBuilder.AppendFormat("{0:C} ", MyInt);
Console.WriteLine(myStringBuilder);
// The example displays the following output:
// Your total is $25.00
Dim MyInt As Integer = 25
Dim myStringBuilder As New StringBuilder("Your total is ")
myStringBuilder.AppendFormat("{0:C} ", MyInt)
Console.WriteLine(myStringBuilder)
' The example displays the following output:
' Your total is $25.00
Insertar
El método Insert agrega una cadena o un objeto en una posición especificada del objeto StringBuilder actual. En el ejemplo siguiente se usa este método para insertar una palabra en la sexta posición de un objeto StringBuilder.
StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Insert(6,"Beautiful ");
Console::WriteLine(myStringBuilder);
// The example displays the following output:
// Hello Beautiful World!
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Insert(6,"Beautiful ");
Console.WriteLine(myStringBuilder);
// The example displays the following output:
// Hello Beautiful World!
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Insert(6, "Beautiful ")
Console.WriteLine(myStringBuilder)
' The example displays the following output:
' Hello Beautiful World!
Quitar
El método Remove se puede usar para quitar un número de caracteres especificado del objeto StringBuilder, a partir de un índice de base cero definido. En el ejemplo siguiente se usa el método Remove para acortar un objeto StringBuilder.
StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Remove(5,7);
Console::WriteLine(myStringBuilder);
// The example displays the following output:
// Hello
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Remove(5,7);
Console.WriteLine(myStringBuilder);
// The example displays the following output:
// Hello
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Remove(5, 7)
Console.WriteLine(myStringBuilder)
' The example displays the following output:
' Hello
Sustituya
El método Replace se puede usar para reemplazar caracteres del objeto StringBuilder por otro carácter especificado. En el ejemplo siguiente se usa el método Replace para buscar todas las instancias del carácter de signo de exclamación (!) y reemplazarlas por el carácter de signo de interrogación (?) en un objeto StringBuilder.
StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Replace('!', '?');
Console::WriteLine(myStringBuilder);
// The example displays the following output:
// Hello World?
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Replace('!', '?');
Console.WriteLine(myStringBuilder);
// The example displays the following output:
// Hello World?
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Replace("!"c, "?"c)
Console.WriteLine(myStringBuilder)
' The example displays the following output:
' Hello World?
Convertir un objeto StringBuilder en String
Debe convertir primero el objeto StringBuilder en un objeto String para poder pasar la cadena representada por el objeto StringBuilder a un método con un parámetro String o mostrarla en la interfaz de usuario. Para hacer esta conversión, llame al método StringBuilder.ToString. En el ejemplo siguiente se llama a varios métodos de StringBuilder y después se llama al método StringBuilder.ToString() para mostrar la cadena.
using System;
using System.Text;
public class Example
{
public static void Main()
{
StringBuilder sb = new StringBuilder();
bool flag = true;
string[] spellings = { "recieve", "receeve", "receive" };
sb.AppendFormat("Which of the following spellings is {0}:", flag);
sb.AppendLine();
for (int ctr = 0; ctr <= spellings.GetUpperBound(0); ctr++) {
sb.AppendFormat(" {0}. {1}", ctr, spellings[ctr]);
sb.AppendLine();
}
sb.AppendLine();
Console.WriteLine(sb.ToString());
}
}
// The example displays the following output:
// Which of the following spellings is True:
// 0. recieve
// 1. receeve
// 2. receive
Imports System.Text
Module Example
Public Sub Main()
Dim sb As New StringBuilder()
Dim flag As Boolean = True
Dim spellings() As String = {"recieve", "receeve", "receive"}
sb.AppendFormat("Which of the following spellings is {0}:", flag)
sb.AppendLine()
For ctr As Integer = 0 To spellings.GetUpperBound(0)
sb.AppendFormat(" {0}. {1}", ctr, spellings(ctr))
sb.AppendLine()
Next
sb.AppendLine()
Console.WriteLine(sb.ToString())
End Sub
End Module
' The example displays the following output:
' Which of the following spellings is True:
' 0. recieve
' 1. receeve
' 2. receive