Optimizando la manipulación de cadenas con la clase StringBuilder

Optimizando la manipulación de cadenas con la clase StringBuilder

Como ya hemos comentado en el apartado anterior, cualquier operación que tengamos que hacer sobre una cadena de caracteres, genera un nuevo objeto String, dado que este es un objeto inalterable una vez instanciado.

Este motivo hace que el rendimiento de la aplicación se vea afectado negativamente, en procesos que requieran operaciones intensivas con cadenas de caracteres, debido a la penalización que impone la generación constante de nuevos objetos String para cualquier mínimo cambio realizado.

Para solventar este problema, el entorno nos provee de la clase StringBuilder, que como su propio nombre indica, nos permite la construcción de cadenas, utilizando un mismo objeto para una serie de operaciones sobre una cadena de caracteres. Una vez terminadas todas las tareas sobre la cadena, podremos asignar el resultado a un objeto String.

Para poder utilizar objetos de esta clase, debemos importar en nuestro código el espacio de nombres System.Text.

Un objeto StringBuilder optimiza su manipulación de la siguiente manera: Al instanciar el objeto, se reserva memoria para una cantidad predeterminada de caracteres. Este valor

viene indicado en la propiedad Capacity, pudiendo ser asignado y consultado. En sucesivas operaciones, si se añaden al objeto más caracteres de los que su capacidad actual está

preparada para contener, se aumenta automáticamente la cantidad de memoria necesaria, de forma que el objeto se adapta a la nueva situación. El incremento de la propiedad Capacity se realiza en valores prefijados, por lo que si queremos saber realmente la longitud de la cadena que contiene el objeto, deberemos consultar la propiedad Length.

El Código fuente 308 contiene un ejemplo de manejo de un objeto StringBuilder, sobre el que realizamos varias operaciones antes de pasarlo definitivamente a un String. A lo largo de este fuente se encuentran comentarios descriptivos de los diferentes miembros utilizados del objeto StringBuilder.

Imports System.Text

Module Module1 Sub Main() ' instanciar un objeto Dim sbCaracteres As StringBuilder = New StringBuilder()

' con el método Append() añadimos caracteres al objeto sbCaracteres.Append("hola ") sbCaracteres.Append("vamos a crear ") sbCaracteres.Append("caracteres con StringBuilder")

' la propiedad Length devuelve la cantidad real ' de caracteres que contiene el objeto Console.WriteLine("Longitud de la cadena del objeto StringBuilder: {0}", _

sbCaracteres.Length)

' la propiedad Capacity devuelve la cantidad de caracteres ' que el objeto puede contener Console.WriteLine("Capacidad del objeto StringBuilder: {0}", _

sbCaracteres.Capacity)

Programación con Visual Basic .NET © Grupo EIDOS

' el método Insert() permite incluir una cadena ' dentro del objeto, a partir de una posición determinada sbCaracteres.Insert(6, "SORPRESA") Console.WriteLine("Inserción de cadena") Console.WriteLine("Cadena: {0}", sbCaracteres.ToString())

' con el método Remove(), borramos a partir de una ' posición del objeto, un número de caracteres sbCaracteres.Remove(45, 3) Console.WriteLine("Eliminación de caracteres") Console.WriteLine("Cadena: {0}", sbCaracteres.ToString())

' con el método Replace(), sustituimos una cadena ' por otra dentro del objeto sbCaracteres.Replace("crear", "pintar") Console.WriteLine("Reemplazo de caracteres") Console.WriteLine("Cadena: {0}", sbCaracteres.ToString())

' la siguiente línea ajusta la capacidad ' del objeto a la cantidad real de caracteres que tiene sbCaracteres.Capacity = sbCaracteres.Length

Console.WriteLine()

' volcamos el contenido del objeto a una cadena, ' el método ToString() devuelve un tipo String, ' que pasamos a una variable de dicho tipo Dim sCadena As String sCadena = sbCaracteres.ToString() Console.WriteLine("La variable sCadena contiene: {0}", sCadena)

Console.ReadLine() End Sub End Module

Código fuente 308