Professional Documents
Culture Documents
Heredado
Protegido
Nombre
Descripcin
StringBuilder()
StringBuilder(Int32)
StringBuilder(String)
StringBuilder(Int32,
Int32)
StringBuilder(String,
Int32)
StringBuilder(String,
Int32, Int32, Int32)
Propiedades
Mostrar:
Heredado
Protegido
Nombre
Descripcin
Capacity
Chars
Length
MaxCapacity
Mtodos
Mostrar:
Heredado
Protegido
Nombre
Descripcin
Append(Boolean)
Append(Byte)
Append(Char)
Append(Char[])
Append(Decimal)
Append(Double)
Append(Int16)
Append(Int32)
Append(Int64)
Append(Object)
Append(SByte)
Append(Single)
Append(String)
Append(UInt16)
Append(UInt32)
Append(UInt64)
Append(Char, Int32)
AppendFormat(String, Object)
AppendFormat(String, Object[])
AppendFormat(String, Object,
Object)
AppendFormat(String, Object,
Object, Object)
AppendLine()
AppendLine(String)
Clear
CopyTo
EnsureCapacity
Equals(Object)
Equals(StringBuilder)
GetHashCode
GetType
Insert(Int32, Boolean)
Insert(Int32, Byte)
Insert(Int32, Char)
Insert(Int32, Char[])
Insert(Int32, Decimal)
Insert(Int32, Double)
Insert(Int32, Int16)
Insert(Int32, Int32)
Insert(Int32, Int64)
Insert(Int32, Object)
Insert(Int32, SByte)
Insert(Int32, Single)
Insert(Int32, String)
Insert(Int32, UInt16)
Insert(Int32, UInt32)
Insert(Int32, UInt64)
Remove
Replace(Char, Char)
Replace(String, String)
ToString()
ToString(Int32, Int32)
Heredado
Protegido
Descripcin
Comentarios
Esta clase representa una cadena como un objeto, cuyo valor es una secuencia de caracteres
modificable.
En esta seccin:
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).
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 .
Valor de cadena
Capacidad
Capacidad mxima
StringBuilder()
String.Empty
16
Int32.MaxValue
StringBuilder(Int3
2)
String.Empty
Int32.MaxValue
StringBuilder(Int3
2, Int32)
String.Empty
Definido por el
parmetro
demaxCapacity
StringBuilder(Stri
ng)
16 o value. Length , lo
que sea mayor
Int32.MaxValue
StringBuilder(Stri
ng, Int32)
Int32.MaxValue
StringBuilder(Stri
ng, Int32, Int32,
Int32)
Definido
por value. Substring (startI
ndex,length)
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;
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.
//
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
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
<
{
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
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 .
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.
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.
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.
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;
}
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
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
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