miércoles, 2 de diciembre de 2015

Cadenas de Caracteres y Manipulación de Texto en C# - Parte 4/5: Clase StringBuilder

Índice

1. Introducción
2. Palabras Clave
3. La Clase StringBuilder
4. StringBuilder vs. String
5. Asignación de Memoria en StringBuilder
6. Otros Métodos de StringBuilder
7. Aspectos Importantes de StringBuilder
8. Conclusiones
9. Literatura & Enlaces

1. Introducción

En artículos anteriores de la serie Cadenas de Caracteres y Manipulación de Texto en C# se ha expuesto los métodos de manipulación de cadenas de caracteres inmutables: objeto que representa una cadena de caracteres que no cambia durante el tiempo de ejecución. En esta parte se discute los objetos opuestos a los anteriores, es decir las cadenas de caracteres mutables. Esto se logra a través del uso de la clase System.Text.StringBuilder. Se estudia de este modo los mecanismos propios de esta clase para manipular cadenas de caracteres de forma más eficiente respecto a String.

2. Palabras Clave

  • Buffer
  • Cadena de caracteres
  • CLR
  • Eficiencia
  • Inmutabilidad
  • Memoria
  • Mutabilidad
  • Stack

3. La Clase StringBuilder


La clase StringBuilder ("StringBuilder Class", 2015) (namespace System.Text) está diseñada para representar cadenas de caracteres mutables, es decir que su contenido se puede editar (Albahari, 2012). Esta clase cuenta con 6 constructores que permiten inicializar un objeto con diferentes parámetros: capacidad, cuota de crecimiento, entre otros.
Constructores StringBuilder
Tabla 1. Constructores StringBuilder ("StringBuilder", 2015).
Suponiendo que se inicia un objeto de esta clase con la capacidad predeterminada -16 caracteres-, a medida que se añada más contenido -caracteres- al objeto StringBuilder, de forma automática se redimensiona su estructura interna para soportar la nueva demanda de capacidad ("StringBuilder Class", 2015). Este proceso de redimensionamiento demanda un coste bajo cómputo; e inclusive cuando alcanza su capacidad máxima. Esta capacidad máxima está determinada por el valor máximo de Int32.MaxValue ("Int32.MaxValue Field", 2015): 2.147.483.647 bytes.

4. StringBuilder vs. String

La clase String posee la misma característica de los tipos primitivos (o integrados): inmutabilidad. Suponiendo que se tiene la expresión

"Blog" + " xCSw"

con se esto se crea una nueva cadena -"BlogxCSw"- en la memoria stack de la CRL. La cuenta de objetos en la estructura stack sería de 2. Mientras que con StringBuilder:

// La variable blog hace referencia al objeto StringBuilder con la cadena "Blog":
StringBuilder nombreCompleto = new StringBuilder("John");

Hasta este punto en la stack existe un objeto en memoria. Continuando:

// Proceso de 'adición' de cadenas
nombreCompleto.Append(" xCSw");

A pesar de la adición de la nueva cadena -"xCSw"- en la estructura stack se mantiene el mismo número de objetos: 1.

Esta es una de las principales diferencias entre estos dos tipos de datos: el almacenamiento. Es evidente que StringBuilder es más eficiente respecto a este requerimiento; y lo es más aún cuando se trata de almacenar cadenas de longitud superiores.

5. Asignación de Memoria en StringBuilder

A través del siguiente ejemplo se puede visualizar cómo un objeto StringBuilder adapta su capacidad de almacenamiento de acuerdo al tamaño o número caracteres que se adicionan a lo largo de la ejecución del programa.

En las líneas 26-36 -método InformacionObjetoStringBuilder- se obtiene a través de reflection ("Receta No. 3-14 en C#", 2015) las propiedades de interés del objeto StringBuider. Para este caso:
  • Capacity
  • MaxCapacity y 
  • Length
El texto inicial del objeto StringBuilder es "Es esta es una frase." -línea 46-. Luego en el ciclo for -líneas 51-55- se invoca hasta 11 veces el método Append para adicionar la cadena "Texto adicional." ese mismo número de veces al objeto objSB. En ese mismo ciclo se invoca al método InformacionObjetoStringBuilder para consultar el estado de las tres propiedades mencionadas.

Al ejecutar este assembly se obtiene en la salida estándar (http://ideone.com/v7AJV4):

MaxCapacity: 2,147,483,647     Capacity: 16     Length: 0     
MaxCapacity: 2,147,483,647     Capacity: 21     Length: 21     
MaxCapacity: 2,147,483,647     Capacity: 42     Length: 37     
MaxCapacity: 2,147,483,647     Capacity: 84     Length: 53     
MaxCapacity: 2,147,483,647     Capacity: 84     Length: 69     
MaxCapacity: 2,147,483,647     Capacity: 168     Length: 85     
MaxCapacity: 2,147,483,647     Capacity: 168     Length: 101     
MaxCapacity: 2,147,483,647     Capacity: 168     Length: 117     
MaxCapacity: 2,147,483,647     Capacity: 168     Length: 133     
MaxCapacity: 2,147,483,647     Capacity: 168     Length: 149     
MaxCapacity: 2,147,483,647     Capacity: 168     Length: 165     
MaxCapacity: 2,147,483,647     Capacity: 336     Length: 181     
MaxCapacity: 2,147,483,647     Capacity: 336     Length: 197

En la primera parte -MaxCapacity- se muestra la capacidad máxima soportada por el objeto StringBuilder: Int32.MaxValue. Enseguida, la capacidad actual del objeto en la propiedad Capacity. Finalmente, con Length el tamaño actual de la cadena de caracteres localizada en el objeto StringBuilder -objSB-.

6. Otros Métodos de StringBuilder

Además del método Append, la clase StringBuilder cuenta con AppendLine ("StringBuilder.AppendLine", 2015") para adicionar una nueva línea de texto:

StringBuilder sb = new StringBuilder("Blog xCSw");
sb.AppendLine();

Por otra parte, con el método AppendFormat ("StringBuilder.AppendFormat", 2015) se adiciona una cadena de caracteres con formato:

StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0} {1}", "Blog", "xCSw");

Existen otros métodos para manipular la cadena de caracteres que representa un objeto StringBuilder; entre esos métodos se puede contar:
  • Insert: para insertar valores de tipos de datos en una posición de la cadena de caracteres de StringBuilder.
  • Remove: para remover una rango de caracteres.
  • Replace: Reemplaza las ocurrencias de un carácter o una cadena de caracteres en la cadena de caracteres de StringBuilder.

7. Aspectos Importantes de StringBuilder

Otras consideraciones importantes a la hora de usar objetos de la clase StringBuilder (Albahari, 2012):
  • Al establecer la propiedad Capacity con una capacidad inferior a la de Length, la primera lanza la excepción: System.ArgumentOutOfRangeException.
  • La capacidad máxima de un objeto StringBuilder alcanza los 2 gigabytes.
  • Si se estable un valor inferior a la longitud actual -propiedad Length- de la cadena en el objeto StringBuilder, entonces su contenido es truncado al nuevo valor inferior al actual.
  • Al establecer un valor superior al de la propiedad Length, el buffer llena esos espacios vacíos con caracteres de espacio.

8. Conclusiones

Se ha estudiado la clase StringBuilder para entender cómo se pueden construir cadenas de caracteres mutables. Gracias a esta propiedad, el programador puede manipular texto en cualquiera de los lenguajes compatibles con la CLR. La amplia capacidad de StringBuilder -2GB- además de resultar apta para textos grandes es mucho más eficiente que la manipulación de cadenas de caracteres con String. En el próximo, y último, artículo de la serie Cadenas de Caracteres y Manipulación de Texto en C# se estudiará codificación de texto.

9. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
StringBuilder Class (System.Text) (2015, diciembre 2). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.text.stringbuilder(v=vs.110).aspx.
Int32.MaxValue Field (System) (2015, diciembre 2). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.int32.maxvalue(v=vs.110).aspx.
Receta No. 3-14 en C#: Investigar los Atributos de un Elemento de Programa con Reflection (2015, diciembre 2). Recuperado desde: http://ortizol.blogspot.com/2014/06/receta-no-3-14-en-csharp-investigar-los-atributos-de-un-elemento-de-program-con-reflection.html.
StringBuilder.AppendLine Method (System.Text) (2015, diciembre 2). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.text.stringbuilder.appendline(v=vs.110).aspx.
StringBuilder.AppendFormat Method (System.Text) (2015, diciembre 2). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.text.stringbuilder.appendformat(v=vs.110).aspx.


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.