You are on page 1of 28

StringBuilder (Clase)

.NET Framework 4.5


Representa una cadena de caracteres modificable. Esta clase no puede heredarse.
Jerarqua de herencia
System.Object
System.Text.StringBuilder
Espacio de nombres: System.Text
Ensamblado: mscorlib (en mscorlib.dll)
Sintaxis
C#
[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class StringBuilder : ISerializable
El tipo StringBuilder expone los siguientes miembros.
Constructores
Mostrar:

Heredado

Protegido

Nombre

Descripcin

StringBuilder()

Inicializa una nueva instancia de la clase StringBuilder.

StringBuilder(Int32)

Inicializa una nueva instancia de la clase StringBuilder con la


capacidad especificada.

StringBuilder(String)

Inicializa una nueva instancia de la clase StringBuilder con la cadena


especificada.

StringBuilder(Int32,
Int32)

Inicializa una nueva instancia de la clase StringBuilder que empieza


con una capacidad concreta y puede aumentar hasta un mximo
especificado.

StringBuilder(String,
Int32)

Inicializa una nueva instancia de la clase StringBuilder con la cadena


y capacidad especificadas.

StringBuilder(String,
Int32, Int32, Int32)

Inicializa una nueva instancia de la clase StringBuilder a partir de la


subcadena y capacidad especificadas.

Propiedades
Mostrar:

Heredado

Protegido

Nombre

Descripcin

Capacity

Obtiene o establece el nmero mximo de caracteres que puede contener la


memoria asignada por la instancia en uso.

Chars

Obtiene o establece el carcter en la posicin de carcter especificada en la


instancia.

Length

Obtiene o establece la longitud del objeto StringBuilder actual.

MaxCapacity

Obtiene la capacidad mxima de la instancia.

Mtodos
Mostrar:

Heredado

Protegido

Nombre

Descripcin

Append(Boolean)

Anexa a esta instancia la representacin en forma de


cadena de un valor booleano especificado.

Append(Byte)

Anexa a esta instancia la representacin en forma de


cadena de un entero sin signo de 8 bits especificado.

Append(Char)

Anexa a esta instancia la representacin en forma de


cadena de un carcter Unicode especificado.

Append(Char[])

Anexa a esta instancia la representacin en forma de


cadena de los caracteres Unicode de una matriz
especificada.

Append(Decimal)

Anexa a esta instancia la representacin en forma de


cadena de un nmero decimal especificado.

Append(Double)

Anexa a esta instancia la representacin en forma de


cadena de un nmero de punto flotante de precisin doble
especificado.

Append(Int16)

Anexa a esta instancia la representacin en forma de


cadena de un entero con signo de 16 bits especificado.

Append(Int32)

Anexa a esta instancia la representacin en forma de


cadena de un entero con signo de 32 bits especificado.

Append(Int64)

Anexa a esta instancia la representacin en forma de


cadena de un entero con signo de 64 bits especificado.

Append(Object)

Anexa a esta instancia la representacin en forma de


cadena de un objeto especificado.

Append(SByte)

Anexa a esta instancia la representacin en forma de


cadena de un entero con signo de 8 bits especificado.

Append(Single)

Anexa a esta instancia la representacin en forma de


cadena de un nmero de punto flotante de precisin
sencilla especificado.

Append(String)

Anexa a esta instancia una copia de la cadena


especificada.

Append(UInt16)

Anexa a esta instancia la representacin en forma de


cadena de un entero sin signo de 16 bits especificado.

Append(UInt32)

Anexa a esta instancia la representacin en forma de


cadena de un entero sin signo de 32 bits especificado.

Append(UInt64)

Anexa a esta instancia la representacin en forma de


cadena de un entero sin signo de 64 bits especificado.

Append(Char, Int32)

Anexa a esta instancia un nmero especificado de copias


de la representacin en forma de cadena de un carcter
Unicode.

Append(Char[], Int32, Int32)

Anexa a esta instancia la representacin en forma de


cadena de una submatriz de caracteres Unicode
especificados.

Append(String, Int32, Int32)

Anexa a esta instancia una copia de una subcadena


especificada.

AppendFormat(String, Object)

Anexa a esta instancia la cadena que se devuelve al


procesar una cadena con formato compuesto, que contiene
cero o ms elementos de formato. Cada elemento de
formato se reemplaza por la representacin en forma de
cadena de un nico argumento.

AppendFormat(String, Object[])

Anexa a esta instancia la cadena que se devuelve al


procesar una cadena con formato compuesto, que contiene
cero o ms elementos de formato. Cada elemento de
formato se reemplaza con la representacin de cadena del
argumento correspondiente de una matriz de parmetros.

AppendFormat(IFormatProvider, Anexa a esta instancia la cadena que se devuelve al


String, Object[])
procesar una cadena con formato compuesto, que contiene
cero o ms elementos de formato. Cada elemento de
formato se reemplaza con la representacin de cadena del
argumento correspondiente de una matriz de parmetros,
utilizando el proveedor de formato especificado.

AppendFormat(String, Object,
Object)

Anexa a esta instancia la cadena que se devuelve al


procesar una cadena con formato compuesto, que contiene
cero o ms elementos de formato. Cada elemento de
formato se reemplaza por la representacin en forma de
cadena de uno de dos argumentos.

AppendFormat(String, Object,
Object, Object)

Anexa a esta instancia la cadena que se devuelve al


procesar una cadena con formato compuesto, que contiene
cero o ms elementos de formato. Cada elemento de
formato se reemplaza por la representacin en forma de
cadena de uno de tres argumentos.

AppendLine()

Anexa el terminador de lnea predeterminado al final del


objeto StringBuilder actual.

AppendLine(String)

Anexa una copia de la cadena especificada seguida del


terminador de lnea predeterminado al final del
objeto StringBuilder actual.

Clear

Quita todos los caracteres de la instancia


de StringBuilder actual.

CopyTo

Copia los caracteres de un segmento especificado de esta


instancia al segmento especificado de una matriz Char de
destino.

EnsureCapacity

Garantiza que la capacidad de la instancia


de StringBuilder corresponde como mnimo al valor
especificado.

Equals(Object)

Determina si el objeto especificado es igual al objeto


actual. (Se hereda de Object).

Equals(StringBuilder)

Devuelve un valor que indica si esta instancia equivale a un


objeto especificado.

GetHashCode

Sirve como una funcin hash para un tipo en particular. (Se


hereda de Object).

GetType

Obtiene el Type de la instancia actual. (Se hereda


de Object).

Insert(Int32, Boolean)

Inserta en la instancia la representacin en forma de


cadena de un valor booleano en la posicin del carcter
que se haya especificado.

Insert(Int32, Byte)

Inserta en la instancia la representacin en forma de


cadena de un entero de 8 bits sin signo, en la posicin del
carcter que se haya especificado.

Insert(Int32, Char)

Inserta en la instancia la representacin en forma de


cadena de un carcter Unicode concreto en la posicin del
carcter que se haya especificado.

Insert(Int32, Char[])

Inserta en la instancia la representacin en forma de


cadena de una matriz concreta de caracteres Unicode en la
posicin del carcter que se haya especificado.

Insert(Int32, Decimal)

Inserta en la instancia la representacin en forma de


cadena de un nmero decimal en la posicin del carcter
que se haya especificado.

Insert(Int32, Double)

Inserta en la instancia la representacin en forma de


cadena de un nmero de punto flotante de doble precisin
en la posicin del carcter que se haya especificado.

Insert(Int32, Int16)

Inserta en esta instancia la representacin en forma de


cadena de un entero de 16 bits con signo especificado, en
la posicin del carcter que se haya indicado.

Insert(Int32, Int32)

Inserta en esta instancia la representacin en forma de


cadena de un entero de 32 bits con signo especificado, en
la posicin del carcter que se haya indicado.

Insert(Int32, Int64)

Inserta en la instancia la representacin en forma de


cadena de un entero de 64 bits con signo, en la posicin
del carcter que se haya especificado.

Insert(Int32, Object)

Inserta en la instancia la representacin en forma de


cadena de un objeto en la posicin del carcter que se
haya especificado.

Insert(Int32, SByte)

Inserta en esta instancia la representacin en forma de


cadena de un entero de 8 bits con signo especificado, en la
posicin del carcter que se haya indicado.

Insert(Int32, Single)

Inserta en la instancia la representacin en forma de


cadena de un nmero de punto flotante de precisin
sencilla en la posicin del carcter que se haya
especificado.

Insert(Int32, String)

Inserta una cadena en la instancia en la posicin del


carcter que se haya especificado.

Insert(Int32, UInt16)

Inserta en esta instancia la representacin en forma de


cadena de un entero de 16 bits sin signo, en la posicin del
carcter que se haya especificado.

Insert(Int32, UInt32)

Inserta en esta instancia la representacin en forma de


cadena de un entero de 32 bits sin signo, en la posicin del
carcter que se haya especificado.

Insert(Int32, UInt64)

Inserta en esta instancia la representacin en forma de


cadena de un entero de 64 bits sin signo, en la posicin del
carcter que se haya especificado.

Insert(Int32, String, Int32)

Inserta en la instancia una o ms copias de una cadena


concreta en la posicin del carcter que se haya
especificado.

Insert(Int32, Char[], Int32, Int32)

Inserta en la instancia la representacin en forma de


cadena de una submatriz concreta de caracteres Unicode
en la posicin del carcter que se haya especificado.

Remove

Quita de la instancia el intervalo de caracteres


especificado.

Replace(Char, Char)

Reemplaza todas las apariciones de un carcter


especificado en la instancia por otro carcter especificado.

Replace(String, String)

Reemplaza todas las apariciones de una cadena


especificada en la instancia por otra cadena especificada.

Replace(Char, Char, Int32,


Int32)

En una subcadena de la instancia, reemplaza todas las


apariciones de un carcter especificado por otro carcter
especificado.

Replace(String, String, Int32,


Int32)

En una subcadena de la instancia, reemplaza todas las


apariciones de una cadena especificada por otra cadena
especificada.

ToString()

Convierte el valor de la instancia en un


objeto String. (Invalida a Object.ToString()).

ToString(Int32, Int32)

Convierte el valor de una subcadena de la instancia en un


objeto String.

Implementaciones de interfaz explcita


Mostrar:
Nombre

Heredado

Protegido
Descripcin

ISerializable.GetObjectData Infraestructura. Rellena un


objeto System.Runtime.Serialization.SerializationInfo con los
datos necesarios para deserializar el objetoStringBuilder actual.

Comentarios
Esta clase representa una cadena como un objeto, cuyo valor es una secuencia de caracteres
modificable.
En esta seccin:

Los tipos string y StringBuilder


Cmo funciona StringBuilder
Asignacin de memoria
Crear instancias de un objeto StringBuilder
Mtodos StringBuilder de llamada
Realizar operaciones de StringBuilder
o Recorrer los caracteres StringBuilder
o Agregar texto a un objeto StringBuilder
o Eliminar el texto de un objeto StringBuilder
o Modificar el texto en un objeto StringBuilder
Buscar texto en un objeto StringBuilder
Convertir el objeto StringBuilder en una cadena

Los tipos string y StringBuilder


Aunque StringBuilder y String ambos representan secuencias de caracteres, se implementan de
manera diferente. String es un tipo inmutable. Es decir, cada operacin que aparece para modificar
un objeto de String verdaderamente crea una nueva cadena.
Por ejemplo, la llamada al mtodo de String.Concat en el siguiente ejemplo de C# se produce para
cambiar el valor de una variable de cadena denominada value. De hecho, el mtodo
deConcat devuelve un objeto de value que tiene un valor diferentes y direccin del objeto
de value que se pas al mtodo. Observe que el ejemplo debe compilarse utilizando la opcin del
compilador /unsafe .
C#
using System;
public class Example
{
public unsafe static void Main()
{
string value = "This is the first sentence" + ".";
fixed (char* start = value)
{
value = String.Concat(value, "This is the second sentence. ");

fixed (char* current = value)


{
Console.WriteLine(start == current);
}
}
}
}
// The example displays the following output:
//
False

Para las rutinas que realizan la manipulacin de cadenas completa (como aplicaciones que
modifican tiempos numerosos de una cadena en un bucle), la modificacin de una cadena puede
exigir repetidamente una reduccin del rendimiento significativa. La alternativa es
utilizar StringBuilder, que es una clase mutable de la cadena. La mutabilidad significa que una vez
que una instancia de la clase se ha creado, puede modificar anexando, quitando, reemplazando, o
insertar caracteres. Un objeto de StringBuilder mantiene un bfer para alojar extensiones a la
cadena. Los nuevos datos se anexa al bfer si el sitio est disponible; si no, se asigna un nuevo,
mayor bfer, los datos del bfer original se copia en el nuevo bfer, y los nuevos datos se anexa al
nuevo bfer.

Importante
Aunque la clase de StringBuilder proporcione normalmente un mejor rendimiento que la clase
de String , no debe automticamente reemplazar String con
StringBuilder siempre que desee manipular las cadenas. El rendimiento depende del tamao de
la cadena, la cantidad de memoria que se afectarn asignado para
la nueva cadena, el sistema en la que se est ejecutando la aplicacin, y el tipo de
operacin. Debe estar preparado para probar la aplicacin para determinar
si StringBuilder proporciona realmente una mejora significativa del rendimiento.
Considere la clase de String en estas condiciones:
Cuando el nmero de cambios que la aplicacin realice una cadena es pequeo. En estos
casos, StringBuilder podra no proporcionar la ninguna de rendimiento mejora insignificante o
sobre String.
Cuando se ejecuta un nmero fijo de operaciones de concatenacin, especialmente con
literales de cadena. En este caso, el compilador podra combinar las operaciones de
concatenacin en una nica operacin.
Si tiene que realizar operaciones de bsqueda extensas mientras compila la cadena. La clase
de StringBuilder falta mtodos de bsqueda como IndexOf o StartsWith. Tendr que
convertir el objeto de StringBuilder a String para estas operaciones, y esto puede invalidar a
las ventajas de utilizar StringBuilder. Para obtener ms informacin, vea la seccin deBuscar
texto en un objeto StringBuilder .
Considere la clase de StringBuilder en estas condiciones:
Cuando se espera que la aplicacin realice un nmero desconocido de cambios en una
cadena en tiempo de diseo (por ejemplo, cuando se utiliza un bucle para concatenar un
nmero aleatorio de cadenas que contienen los datos proporcionados por el usuario).

Cuando se espera que la aplicacin realice un nmero significativo de cambios en una


cadena.

Cmo funciona StringBuilder


La propiedad de StringBuilder.Length indica que el nmero de caracteres que el objeto
de StringBuilder contiene actualmente. Si agrega los caracteres al objeto de StringBuilder , su
longitud aumenta hasta que equivale al tamao de la propiedad de StringBuilder.Capacity , que
define el nmero de caracteres que el objeto puede contener. Si el nmero de caracteres incluidos
hace que la longitud del objeto de StringBuilder supere la capacidad actual, se asigna nueva
memoria, el valor de la propiedad de Capacity se duplica, los caracteres nuevos se agregan al objeto
de StringBuilder , y la propiedad de Length se ajusta. Memoria adicional para el objeto
de StringBuilder se asigna dinmicamente hasta alcanzar el valor definido por la propiedad
de StringBuilder.MaxCapacity . Cuando se alcanza la capacidad mxima, ninguna otra memoria se
puede asignar para el objeto de StringBuilder y, al intentar agregar caracteres o para expandirla ms
all de su capacidad mxima produce ArgumentOutOfRangeException o una excepcin
de OutOfMemoryException .
El ejemplo siguiente se muestra cmo un objeto de StringBuilder asigna nueva memoria y aumenta
la capacidad dinmicamente a medida que expande la cadena asignada al objeto. El cdigo crea un
objeto de StringBuilder llamando a su constructor predeterminado (sin parmetros). La capacidad
predeterminada de este objeto es 16 caracteres, y la capacidad mxima es ms de 2 millones de
caracteres. Anexar la cadena Esta es una frase. resultados en una nueva asignacin de memoria
porque la longitud de la cadena (19 caracteres) supera la capacidad predeterminada del objeto
de StringBuilder . La capacidad del objeto duplica a 32 caracteres, se agrega la nueva cadena, y la
longitud del objeto ahora es igual a 19 caracteres. El cdigo se anexa la cadena Esta es una frase
adicional. el valor del objeto de StringBuilder 11 veces. Siempre que la operacin de anexar haga la
longitud del objeto de StringBuilder para superar su capacidad, se duplica su capacidad existente y la
operacin de Append correctamente.
C#
using System;
using System.Reflection;
using System.Text;
public class Example
{
public static void Main()
{
StringBuilder sb = new StringBuilder();
ShowSBInfo(sb);
sb.Append("This is a sentence.");
ShowSBInfo(sb);
for (int ctr = 0; ctr <= 10; ctr++) {
sb.Append("This is an additional sentence.");
ShowSBInfo(sb);
}
}
private static void ShowSBInfo(StringBuilder sb)
{

foreach (var prop in sb.GetType().GetProperties()) {


if (prop.GetIndexParameters().Length == 0)
Console.Write("{0}: {1:N0} ", prop.Name, prop.GetValue(sb));
}
Console.WriteLine();
}
}
// The example displays the following output:
// Capacity: 16 MaxCapacity: 2,147,483,647 Length: 0
// Capacity: 32 MaxCapacity: 2,147,483,647 Length: 19
// Capacity: 64 MaxCapacity: 2,147,483,647 Length: 50
// Capacity: 128 MaxCapacity: 2,147,483,647 Length: 81
// Capacity: 128 MaxCapacity: 2,147,483,647 Length: 112
// Capacity: 256 MaxCapacity: 2,147,483,647 Length: 143
// Capacity: 256 MaxCapacity: 2,147,483,647 Length: 174
// Capacity: 256 MaxCapacity: 2,147,483,647 Length: 205
// Capacity: 256 MaxCapacity: 2,147,483,647 Length: 236
// Capacity: 512 MaxCapacity: 2,147,483,647 Length: 267
// Capacity: 512 MaxCapacity: 2,147,483,647 Length: 298
// Capacity: 512 MaxCapacity: 2,147,483,647 Length: 329
// Capacity: 512 MaxCapacity: 2,147,483,647 Length: 360

Asignacin de memoria
La capacidad predeterminada de un objeto de StringBuilder es de 16 caracteres, y la capacidad
mxima predeterminada es Int32.MaxValue. Se utilizan estos valores predeterminados si se llama a
los constructores de StringBuilder() y de StringBuilder(String) .
Puede definir explcitamente la capacidad inicial de un objeto de StringBuilder de las maneras
siguientes:
Llamando a cualquiera de los constructores de StringBuilder que incluye un parmetro
de capacity cuando se crea el objeto.
Explcitamente asignando un nuevo valor a la propiedad de StringBuilder.Capacity para
expandir un objeto existente de StringBuilder . Observe que la propiedad produce una
excepcin si la nueva capacidad es menor que la funcionalidad existente o mayor que la
capacidad mxima del objeto de StringBuilder .
Llamando al mtodo de StringBuilder.EnsureCapacity con la nueva funcin. La nueva funcin
no debe ser mayor que la mxima capacidad de objeto de StringBuilder . Sin embargo, a
diferencia de una asignacin a la propiedad de Capacity , EnsureCapacity no produce una
excepcin si la nueva funcin deseada es menor que la funcionalidad existente; en este caso,
la llamada al mtodo no tiene ningn efecto.
Si la longitud de la cadena asignada al objeto de StringBuilder en la llamada de constructor supera la
capacidad predeterminada o la capacidad especificada, la propiedad de Capacity se establece en la
longitud de la cadena especificada mediante el parmetro de value .
Puede definir explcitamente la capacidad mxima de un objeto de StringBuilder llamando al
constructor de StringBuilder(Int32, Int32) . No puede cambiar la capacidad mxima asignando un
nuevo valor a la propiedad de MaxCapacity , porque es de slo lectura.
Como se muestra en la seccin anterior muestra, siempre que la funcionalidad existente es
incorrecta, se asigna la memoria adicional y la capacidad de dobles de un objeto
de StringBuilderhasta el valor est definida por la propiedad de MaxCapacity .

Normalmente la capacidad predeterminada y la capacidad mxima son adecuadas para la mayora


de las aplicaciones. Puede considerar establecer estos valores en las condiciones siguientes:
Si el tamao finalmente del objeto de StringBuilder es probable crecer excesivamente grande,
normalmente superior a varios megabytes. En este caso, puede haber cierta mejora en el
rendimiento de establecer la propiedad inicial de Capacity significativamente a un valor alto
para eliminar la necesidad de demasiadas reasignaciones de memoria.
Si la aplicacin se ejecuta en un sistema con memoria limitada. En este caso, puede que
desee considerar establecer la propiedad de MaxCapacity menos que Int32.MaxValue si la
aplicacin est administrando cadenas grandes que pueden hacer para ejecutarse en un
entorno restringido desplazarlo.
Crear instancias de un objeto StringBuilder
Crea instancias de un objeto de StringBuilder llamando a uno de los seis constructores de clase
sobrecargados, que se enumeran en la tabla siguiente. Tres de los constructores crean instancias de
un objeto de StringBuilder cuyo valor es una cadena vaca, pero establece sus valores de Capacity y
de MaxCapacity de manera diferente. Los tres constructores restantes definen un objeto
de StringBuilder que tiene un valor de cadena y una capacidad concretos. Dos de los tres
constructores utilizan la capacidad mxima predeterminada de Int32.MaxValue, mientras que el
tercero permite establecer la capacidad mxima.
Constructor

Valor de cadena

Capacidad

Capacidad mxima

StringBuilder()

String.Empty

16

Int32.MaxValue

StringBuilder(Int3
2)

String.Empty

Definido por el parmetro


de capacity

Int32.MaxValue

StringBuilder(Int3
2, Int32)

String.Empty

Definido por el parmetro


de capacity

Definido por el
parmetro
demaxCapacity

StringBuilder(Stri
ng)

Definido por el parmetro


de value

16 o value. Length , lo
que sea mayor

Int32.MaxValue

StringBuilder(Stri
ng, Int32)

Definido por el parmetro


de value

Definido por el parmetro


o valuede capacity . Leng
th , lo que sea mayor.

Int32.MaxValue

StringBuilder(Stri
ng, Int32, Int32,
Int32)

Definido
por value. Substring (startI
ndex,length)

Definido por el parmetro


o valuede capacity . Leng
th , lo que sea mayor.

Definido por el
parmetro
demaxCapacity

El ejemplo siguiente utiliza tres de estas sobrecargas del constructor para crear instancias de los
objetos de StringBuilder .
C#
using System;
using System.Text;

public class Example


{
public static void Main()
{
string value = "An ordinary string";
int index = value.IndexOf("An ") + 3;
int capacity = 0xFFFF;
// Instantiate a StringBuilder from a string.
StringBuilder sb1 = new StringBuilder(value);
ShowSBInfo(sb1);
// Instantiate a StringBuilder from string and define a capacity.
StringBuilder sb2 = new StringBuilder(value, capacity);
ShowSBInfo(sb2);
// Instantiate a StringBuilder from substring and define a capacity.
StringBuilder sb3 = new StringBuilder(value, index,
value.Length - index,
capacity );
ShowSBInfo(sb3);
}
public static void ShowSBInfo(StringBuilder sb)
{
Console.WriteLine("\nValue: {0}", sb.ToString());
foreach (var prop in sb.GetType().GetProperties()) {
if (prop.GetIndexParameters().Length == 0)
Console.Write("{0}: {1:N0} ", prop.Name, prop.GetValue(sb));
}
Console.WriteLine();
}
}
// The example displays the following output:
// Value: An ordinary string
// Capacity: 18 MaxCapacity: 2,147,483,647 Length: 18
//
// Value: An ordinary string
// Capacity: 65,535 MaxCapacity: 2,147,483,647 Length: 18
//
// Value: ordinary string
// Capacity: 65,535 MaxCapacity: 2,147,483,647 Length: 15

Mtodos StringBuilder de llamada


La mayora de los mtodos que modifican la cadena en un retorno de la instancia
de StringBuilder una referencia a la misma instancia. Esto permite llamar a los mtodos
de StringBuilder de dos maneras:
Puede hacer llamadas a mtodos individuales y omitir el valor devuelto, como ocurre en el
ejemplo siguiente.

C#
using System;
using System.Text;
public class Example
{
public static void Main()
{
StringBuilder sb = new StringBuilder();
sb.Append("This is the beginning of a sentence, ");
sb.Replace("the beginning of ", "");
sb.Insert(sb.ToString().IndexOf("a ") + 2, "complete ");
sb.Replace(",", ".");
Console.WriteLine(sb.ToString());
}
}
// The example displays the following output:
//
This is a complete sentence.

Puede realizar una serie de llamadas a mtodos en una sola instruccin. Esto puede ser
conveniente si desea escribir en una sola instruccin esa cadenas las operaciones
sucesivas. El ejemplo siguiente consolida tres llamadas al mtodo del ejemplo anterior en una
sola lnea de cdigo.
C#
using System;
using System.Text;
public class Example
{
public static void Main()
{
StringBuilder sb = new StringBuilder("This is the beginning of a sentence, ");
sb.Replace("the beginning of ", "").Insert(sb.ToString().IndexOf("a ") + 2,
"complete ").Replace(",", ".");
Console.WriteLine(sb.ToString());
}
}
// The example displays the following output:
//
This is a complete sentence.

Realizar operaciones de StringBuilder


Puede utilizar los mtodos de la clase de StringBuilder para recorrer, para agregar, eliminar, o para
modificar los caracteres de un objeto de StringBuilder .

Recorrer los caracteres StringBuilder


Puede tener acceso a los caracteres de un objeto de StringBuilder mediante la propiedad
de StringBuilder.Chars . En C#, Chars es indizadora; en Visual Basic, es la propiedad
predeterminada de la clase de StringBuilder . Esto permite establecer o recuperar los caracteres
individuales utilizando el ndice slo, sin hacer referencia explcitamente a la propiedad
de Chars . Caracteres en un objeto de StringBuilder comienzan en el ndice 0 (cero) y continan el
ndice Length - 1.
El ejemplo siguiente se muestra la propiedad de Chars . Anexa diez nmeros aleatorios a un objeto
de StringBuilder , y despus recorre cada carcter. Si la categora Unicode de caracteres
es UnicodeCategory.DecimalDigitNumber, reduzca el nmero por 1 (o cambia el nmero en 9 si el
valor es 0). El ejemplo muestra el contenido del objeto de StringBuilder tanto antes como despus de
que los valores de caracteres individuales se cambiaron.
C#
using System;
using System.Globalization;
using System.Text;
public class Example
{
public static void Main()
{
Random rnd = new Random();
StringBuilder sb = new StringBuilder();
// Generate 10 random numbers and store them in a StringBuilder.
for (int ctr = 0; ctr <= 9; ctr++)
sb.Append(rnd.Next().ToString("N5"));
Console.WriteLine("The original string:");
Console.WriteLine(sb.ToString());
// Decrease each number by one.
for (int ctr = 0; ctr < sb.Length; ctr++) {
if (Char.GetUnicodeCategory(sb[ctr]) == UnicodeCategory.DecimalDigitNumber) {
int number = (int) Char.GetNumericValue(sb[ctr]);
number--;
if (number < 0) number = 9;
sb[ctr] = number.ToString()[0];
}
}
Console.WriteLine("\nThe new string:");
Console.WriteLine(sb.ToString());
}
}
// The example displays the following output:
// The original string:
//
1,457,531,530.00000940,522,609.000001,668,113,564.000001,998,992,883.000001,792,660,834.00

//
000101,203,251.000002,051,183,075.000002,066,000,067.000001,643,701,043.000001,702,382,50
8
// .00000
//
// The new string:
//
0,346,420,429.99999839,411,598.999990,557,002,453.999990,887,881,772.999990,681,559,723.99
//
999090,192,140.999991,940,072,964.999991,955,999,956.999990,532,690,932.999990,691,271,49
7
// .99999

Agregar texto a un objeto StringBuilder


La clase de StringBuilder incluye los siguientes mtodos para expandir el contenido de un objeto
de StringBuilder :
El mtodo de Append anexa una cadena, una subcadena, una matriz de caracteres, una parte
de una matriz de caracteres, un carcter individual repetido varias veces, o la representacin
de cadena de un tipo de datos primitivo a un objeto de StringBuilder .
El mtodo de AppendLine anexa un terminador de lnea o una cadena junto con un terminador
de lnea a un objeto de StringBuilder .
El mtodo de AppendFormat anexa cadena de formato compuesto a un objeto
de StringBuilder . Las representaciones de cadena de los objetos incluidos en la cadena de
resultado pueden reflejar las convenciones de formato de la referencia cultural actual del
sistema o de una referencia cultural especificada.
El mtodo de Insert inserta una cadena, una subcadena, repeticiones varias de una cadena,
una matriz de caracteres, una parte de una matriz de caracteres, o la representacin de
cadena de un tipo de datos primitivo en una posicin especificada del objeto
de StringBuilder . La posicin se define mediante un ndice cero- basado.
El ejemplo siguiente utiliza Append, AppendLine, AppendFormat, y los mtodos de Insert para
expandir el texto de un objeto de StringBuilder .
C#
using System;
using System.Text;
public class Example
{
public static void Main()
{
// Create a StringBuilder object with no text.
StringBuilder sb = new StringBuilder();
// Append some text.
sb.Append('*', 10).Append(" Adding Text to a StringBuilder Object ").Append('*', 10);
sb.AppendLine("\n");
sb.AppendLine("Some code points and their corresponding characters:");
// Append some formatted text.
for (int ctr = 50; ctr <= 60; ctr++) {
sb.AppendFormat("{0,12:X4} {1,12}", ctr, Convert.ToChar(ctr));

sb.AppendLine();
}
// Find the end of the introduction to the column.
int pos = sb.ToString().IndexOf("characters:") + 11 +
Environment.NewLine.Length;
// Insert a column header.
sb.Insert(pos, String.Format("{2}{0,12:X4} {1,12}{2}", "Code Unit",
"Character", "\n"));
// Convert the StringBuilder to a string and display it.
Console.WriteLine(sb.ToString());
}
}
// The example displays the following output:
// ********** Adding Text to a StringBuilder Object **********
//
// Some code points and their corresponding characters:
//
//
Code Unit Character
//
0032
2
//
0033
3
//
0034
4
//
0035
5
//
0036
6
//
0037
7
//
0038
8
//
0039
9
//
003A
:
//
003B
;
//
003C
<

Eliminar el texto de un objeto StringBuilder


La clase de StringBuilder incluye mtodos que pueden reducir el tamao de la instancia actual
de StringBuilder . El mtodo de Clear quita todos los caracteres y establezca la propiedad
deLength a cero. El mtodo de Remove elimina un nmero especificado de caracteres que comienza
en una posicin de ndice determinada. Adems, puede quitar los caracteres del final de un objeto
de StringBuilder estableciendo su propiedad de Length en un valor menor que la longitud de la
instancia actual.
El ejemplo siguiente quita algo de texto de un objeto de StringBuilder , muestra su capacidad
resultante, capacidad mxima, y los valores de propiedad de longitud, y despus llamar al mtodo
de Clear para quitar todos los caracteres del objeto de StringBuilder .
C#
using System;
using System.Text;
public class Example
{
public static void Main()

{
StringBuilder sb = new StringBuilder("A StringBuilder object");
ShowSBInfo(sb);
// Remove "object" from the text.
string textToRemove = "object";
int pos = sb.ToString().IndexOf(textToRemove);
if (pos >= 0) {
sb.Remove(pos, textToRemove.Length);
ShowSBInfo(sb);
}
// Clear the StringBuilder contents.
sb.Clear();
ShowSBInfo(sb);
}
public static void ShowSBInfo(StringBuilder sb)
{
Console.WriteLine("\nValue: {0}", sb.ToString());
foreach (var prop in sb.GetType().GetProperties()) {
if (prop.GetIndexParameters().Length == 0)
Console.Write("{0}: {1:N0} ", prop.Name, prop.GetValue(sb));
}
Console.WriteLine();
}
}
// The example displays the following output:
// Value: A StringBuilder object
// Capacity: 22 MaxCapacity: 2,147,483,647
//
// Value: A StringBuilder
// Capacity: 22 MaxCapacity: 2,147,483,647
//
// Value:
// Capacity: 22 MaxCapacity: 2,147,483,647

Length: 22

Length: 16

Length: 0

Modificar el texto en un objeto StringBuilder


El mtodo de StringBuilder.Replace reemplaza todas las apariciones de un carcter o cadena en el
objeto completo de StringBuilder o en un intervalo determinado de carcter. El ejemplo siguiente se
usa el mtodo de Replace para reemplazar todos los signos de exclamacin (!) con signos de
interrogacin (?) en el objeto de StringBuilder .
C#
using System;
using System.Text;
public class Example
{
public static void Main()
{
StringBuilder MyStringBuilder = new StringBuilder("Hello World!");

MyStringBuilder.Replace('!', '?');
Console.WriteLine(MyStringBuilder);
}
}
// The example displays the following output:
//
Hello World?
Buscar texto en un objeto StringBuilder
La clase de StringBuilder no incluye mtodos similares a String.Contains, a String.IndexOf, y
mtodos de String.StartsWith proporcionados por la clase de String , que le permiten buscar en el
objeto para un carcter concreto o una subcadena. Determinar la presencia o iniciar la posicin de
carcter de una subcadena requiere que busca un valor de String utilizando un mtodo de bsqueda
de cadenas o de la expresin regular. Hay cuatro maneras de implementar tales bsquedas, como
se muestra en la tabla siguiente.
Tcnica

Ventajas

Cons

Valores de cadena de
bsqueda antes de
agregarlas al objeto
de StringBuilder .

til para determinar si


existe una subcadena.

No se puede usar cuando la posicin de


ndice de una subcadena
es importante.

Llame a ToString y
busque el objeto
devuelto de String .

Fcil de utilizar si
asigna todo el texto en
un objeto
de StringBuilder , y
despus inicie para
modificarlo.

Complejo llamar repetidamente ToString si


debe realizar
modificaciones antes de que todo el texto se
agrega al objeto deStringBuilder .Debe
recordar el funcionamiento del final del texto
del objeto deStringBuilder si realiza cambios.

Utilice la propiedad
de Chars para buscar
secuencialmente un
intervalo de caracteres.

til si se hace
referencia a caracteres
individuales o a una
pequea subcadena.

Complicados si el nmero de caracteres a


buscar es grande o si la
lgica de bsqueda es compleja.

Convierte el objeto
de StringBuilder a un
objeto
deString , y realice las
modificaciones en el
objeto deString .

til si el nmero de
modificaciones es
pequeo.

Niega la ventaja de rendimiento de la clase


de StringBuilder si el
nmero de modificaciones es grande.

Examinemos estas tcnicas con mayor detalle.


Si el objetivo de bsqueda es determinar si existe una subcadena determinada (es decir, si no
est interesado en la posicin de la subcadena), puede buscar cadenas antes de almacenar
en el objeto de StringBuilder . En el ejemplo siguiente se proporciona una forma posible de
implementacin. Define una clase de StringBuilderFinder cuyo pasen a constructor una
referencia a un objeto de StringBuilder y la subcadena para buscar en la cadena. En este
caso, el ejemplo intenta determinar si las temperaturas grabadas estn en Fahrenheit o
Celsius, y agrega texto preliminar adecuado al principio del objeto de StringBuilder . Un

generador de nmeros aleatorios se utiliza para seleccionar una matriz que contiene datos en
grados centgrados o los grados Fahrenheit.
C#
using System;
using System.Text;
public class Example
{
public static void Main()
{
Random rnd = new Random();
string[] tempF = { "47.6F", "51.3F", "49.5F", "62.3F" };
string[] tempC = { "21.2C", "16.1C", "23.5C", "22.9C" };
string[][] temps = { tempF, tempC };
StringBuilder sb = new StringBuilder();
var f = new StringBuilderFinder(sb, "F");
var baseDate = new DateTime(2013, 5, 1);
String[] temperatures = temps[rnd.Next(2)];
bool isFahrenheit = false;
foreach (var temperature in temperatures) {
if (isFahrenheit)
sb.AppendFormat("{0:d}: {1}\n", baseDate, temperature);
else
isFahrenheit = f.SearchAndAppend(String.Format("{0:d}: {1}\n",
baseDate, temperature));
baseDate = baseDate.AddDays(1);
}
if (isFahrenheit) {
sb.Insert(0, "Average Daily Temperature in Degrees Fahrenheit");
sb.Insert(47, "\n\n");
}
else {
sb.Insert(0, "Average Daily Temperature in Degrees Celsius");
sb.Insert(44, "\n\n");
}
Console.WriteLine(sb.ToString());
}
}
public class StringBuilderFinder
{
private StringBuilder sb;
private String text;
public StringBuilderFinder(StringBuilder sb, String textToFind)
{
this.sb = sb;
this.text = textToFind;
}

public bool SearchAndAppend(String stringToSearch)


{
sb.Append(stringToSearch);
return stringToSearch.Contains(text);
}
}
// The example displays output similar to the following:
// Average Daily Temperature in Degrees Celsius
//
// 5/1/2013: 21.2C
// 5/2/2013: 16.1C
// 5/3/2013: 23.5C
// 5/4/2013: 22.9C

Llame al mtodo de StringBuilder.ToString para convertir el objeto de StringBuilder a un objeto


de String . Puede buscar la cadena mediante mtodos
como String.LastIndexOf oString.StartsWith, o puede utilizar expresiones regulares y la clase
de Regex para buscar modelos. Dado que StringBuilder y los objetos de String utilizan la
codificacin UTF-16 para almacenar los caracteres, las posiciones de ndice de caracteres, de
subcadenas, y de coincidencias de expresiones regulares son iguales en ambos objetos. Esto
permite utilizar los mtodos de StringBuilder para realizar cambios en la misma posicin en la
que el texto se encuentra en el objeto de String .

Nota
Si adopta este enfoque, debe ejecutar el final del objeto de StringBuilder al principio de modo que
no tenga que repetidamente convertir el objeto de
StringBuilder en una cadena.

En el ejemplo siguiente se muestra este enfoque. Almacena cuatro apariciones de cada letra
del alfabeto ingls en un objeto de StringBuilder . Despus convierte el texto a un objeto
de String y utiliza una expresin regular para identificar la posicin inicial de cada secuencia
de cuatro- carcter. Finalmente, agregue un subrayado antes de cada secuencia de cuatrocarcter salvo la primera secuencia, y convierte el primer carcter de la secuencia a
maysculas.

C#
using System;
using System.Text;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()

{
// Create a StringBuilder object with 4 successive occurrences
// of each character in the English alphabet.
StringBuilder sb = new StringBuilder();
for (ushort ctr = (ushort)'a'; ctr <= (ushort) 'z'; ctr++)
sb.Append(Convert.ToChar(ctr), 4);
// Create a parallel string object.
String sbString = sb.ToString();
// Determine where each new character sequence begins.
String pattern = @"(\w)\1+";
MatchCollection matches = Regex.Matches(sbString, pattern);
// Uppercase the first occurrence of the sequence, and separate it
// from the previous sequence by an underscore character.
for (int ctr = matches.Count - 1; ctr >= 0; ctr--) {
Match m = matches[ctr];
sb[m.Index] = Char.ToUpper(sb[m.Index]);
if (m.Index > 0) sb.Insert(m.Index, "_");
}
// Display the resulting string.
sbString = sb.ToString();
int line = 0;
do {
int nChars = line * 80 + 79 <= sbString.Length ?
80 : sbString.Length - line * 80;
Console.WriteLine(sbString.Substring(line * 80, nChars));
line++;
} while (line * 80 < sbString.Length);
}
}
// The example displays the following output:
//
Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Ppp
p_
// Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz

Utilice la propiedad de StringBuilder.Chars para buscar secuencialmente un intervalo de


caracteres en un objeto de StringBuilder . Este enfoque puede no ser prctico si el nmero de
caracteres que se buscar es grande o la lgica de bsqueda resulta particularmente
compleja.
El ejemplo siguiente es idntico en funcionalidad al ejemplo anterior pero difiere en la
implementacin. Utiliza la propiedad de Chars para detectar cuando un valor de carcter ha
cambiado, inserta un carcter de subrayado en esa posicin, y convierte el primer carcter de
la nueva secuencia a maysculas.
C#
using System;
using System.Text;

public class Example


{
public static void Main()
{
// Create a StringBuilder object with 4 successive occurrences
// of each character in the English alphabet.
StringBuilder sb = new StringBuilder();
for (ushort ctr = (ushort) 'a'; ctr <= (ushort) 'z'; ctr++)
sb.Append(Convert.ToChar(ctr), 4);
// Iterate the text to determine when a new character sequence occurs.
int position = 0;
Char current = '\u0000';
do {
if (sb[position] != current) {
current = sb[position];
sb[position] = Char.ToUpper(sb[position]);
if (position > 0)
sb.Insert(position, "_");
position += 2;
}
else {
position++;
}
} while (position <= sb.Length - 1);
// Display the resulting string.
String sbString = sb.ToString();
int line = 0;
do {
int nChars = line * 80 + 79 <= sbString.Length ?
80 : sbString.Length - line * 80;
Console.WriteLine(sbString.Substring(line * 80, nChars));
line++;
} while (line * 80 < sbString.Length);
}
}
// The example displays the following output:
//
Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Ppp
p_
// Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz

Almacenar todo el texto sin modificar en el objeto de StringBuilder , llame al mtodo


de StringBuilder.ToString para convertir el objeto de StringBuilder a un objeto de String , y
realice las modificaciones en el objeto de String . Puede utilizar este enfoque si slo tiene
algunas modificaciones; si no, el costo de trabajar con cadenas inmutables puede invalidar las
ventajas de rendimiento de usar un objeto de StringBuilder .
El ejemplo siguiente es idntico en funcionalidad a los dos ejemplos anteriores pero difiere en
la implementacin. Crea un objeto de StringBuilder , se convierte en un objeto deString , y

despus utilizar una expresin regular para realizar todas las modificaciones restantes en la
cadena. El mtodo de Regex.Replace(String, String, MatchEvaluator) usa una expresin
lambda para realizar el reemplazo en cada coincidencia.

C#
using System;
using System.Text;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
// Create a StringBuilder object with 4 successive occurrences
// of each character in the English alphabet.
StringBuilder sb = new StringBuilder();
for (ushort ctr = (ushort)'a'; ctr <= (ushort) 'z'; ctr++)
sb.Append(Convert.ToChar(ctr), 4);
// Convert it to a string.
String sbString = sb.ToString();
// Use a regex to uppercase the first occurrence of the sequence,
// and separate it from the previous sequence by an underscore.
string pattern = @"(\w)(\1+)";
sbString = Regex.Replace(sbString, pattern,
m => (m.Index > 0 ? "_" : "") +
m.Groups[1].Value.ToUpper() +
m.Groups[2].Value);
// Display the resulting string.
int line = 0;
do {
int nChars = line * 80 + 79 <= sbString.Length ?
80 : sbString.Length - line * 80;
Console.WriteLine(sbString.Substring(line * 80, nChars));
line++;
} while (line * 80 < sbString.Length);
}
}
// The example displays the following output:
//
Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Ppp
p_
// Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz

Convertir el objeto StringBuilder en una cadena

Debe convertir el objeto StringBuilder en un objeto String antes de poder pasar la cadena
representada por el objeto StringBuilder a un mtodo que tenga un parmetro String o mostrarlo en
la interfaz de usuario. Realiza esta conversin llamando al mtodo de StringBuilder.ToString . Para
obtener un ejemplo, vea el ejemplo anterior, que llama al mtodo de ToString para convertir un
objeto de StringBuilder a una cadena para que se pueda pasar a un mtodo de expresiones
regulares.
Notas para los llamadores
En .NET Framework 4 y .NET Framework 4.5, cuando se crea una instancia del objeto
de StringBuilder llamando al constructor de StringBuilder(Int32, Int32) , la longitud y la capacidad de
la instancia de StringBuilder pueden ir ms all del valor de la propiedad de MaxCapacity . Esto
puede ocurrir determinado cuando llame a los mtodos de Append y de AppendFormat para anexar
las cadenas pequeas.
Ejemplos
En el ejemplo siguiente se muestra cmo llamar a muchos de los mtodos que define la
clase StringBuilder.
C#
using System;
using System.Text;
public sealed class App
{
static void Main()
{
// Create a StringBuilder that expects to hold 50 characters.
// Initialize the StringBuilder with "ABC".
StringBuilder sb = new StringBuilder("ABC", 50);
// Append three characters (D, E, and F) to the end of the StringBuilder.
sb.Append(new char[] { 'D', 'E', 'F' });
// Append a format string to the end of the StringBuilder.
sb.AppendFormat("GHI{0}{1}", 'J', 'k');
// Display the number of characters in the StringBuilder and its string.
Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());
// Insert a string at the beginning of the StringBuilder.
sb.Insert(0, "Alphabet: ");
// Replace all lowercase k's with uppercase K's.
sb.Replace('k', 'K');
// Display the number of characters in the StringBuilder and its string.
Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());
}
}
// This code produces the following output.
//
// 11 chars: ABCDEFGHIJk
// 21 chars: Alphabet: ABCDEFGHIJK

You might also like