Usando a classe StringBuilder no .NET
O String objeto é imutável. Toda vez que você usa um dos métodos na System.String classe, você cria um novo objeto string na memória, que requer uma nova alocação de espaço para esse novo objeto. Em situações em que você precisa executar modificações repetidas em uma cadeia de caracteres, a sobrecarga associada à criação de um novo String objeto pode ser cara. A System.Text.StringBuilder classe pode ser usada quando você deseja modificar uma cadeia de caracteres sem criar um novo objeto. Por exemplo, usar a classe pode aumentar o StringBuilder desempenho ao concatenar muitas cadeias de caracteres juntas em um loop.
Importando o namespace System.Text
A StringBuilder classe é encontrada no System.Text namespace. Para evitar ter que fornecer um nome de tipo totalmente qualificado em seu código, você pode importar o System.Text namespace:
using namespace System;
using namespace System::Text;
using System;
using System.Text;
Imports System.Text
Instanciando um objeto StringBuilder
Você pode criar uma nova instância da StringBuilder classe inicializando sua variável com um dos métodos de construtor sobrecarregados, conforme ilustrado no exemplo a seguir.
StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
Dim myStringBuilder As New StringBuilder("Hello World!")
Definindo a capacidade e o comprimento
Embora o StringBuilder seja um objeto dinâmico que permite expandir o número de caracteres na cadeia de caracteres que ele encapsula, você pode especificar um valor para o número máximo de caracteres que ele pode conter. Esse valor é chamado de capacidade do objeto e não deve ser confundido com o comprimento da cadeia de caracteres que a corrente StringBuilder retém. Por exemplo, você pode criar uma nova instância da classe com a cadeia de StringBuilder caracteres "Hello", que tem um comprimento de 5, e você pode especificar que o objeto tem uma capacidade máxima de 25. Quando você modifica o StringBuilder, ele não realoca o tamanho para si mesmo até que a capacidade seja atingida. Quando isso ocorre, o novo espaço é alocado automaticamente e a capacidade é dobrada. Você pode especificar a StringBuilder capacidade da classe usando um dos construtores sobrecarregados. O exemplo a seguir especifica que o myStringBuilder
objeto pode ser expandido para um máximo de 25 espaços.
StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!", 25);
StringBuilder myStringBuilder = new StringBuilder("Hello World!", 25);
Dim myStringBuilder As New StringBuilder("Hello World!", 25)
Além disso, você pode usar a propriedade read/write Capacity para definir o comprimento máximo do seu objeto. O exemplo a seguir usa a propriedade Capacity para definir o comprimento máximo do objeto.
myStringBuilder->Capacity = 25;
myStringBuilder.Capacity = 25;
myStringBuilder.Capacity = 25
O EnsureCapacity método pode ser usado para verificar a capacidade do StringBuilder atual. Se a capacidade for maior do que o valor passado, nenhuma alteração será feita; no entanto, se a capacidade for menor do que o valor passado, a capacidade atual será alterada para corresponder ao valor passado.
A Length propriedade também pode ser visualizada ou definida. Se você definir a propriedade Length para um valor maior que a propriedade Capacity , a propriedade Capacity será automaticamente alterada para o mesmo valor da propriedade Length . Definir a propriedade Length para um valor que é menor do que o comprimento da cadeia de caracteres dentro do StringBuilder atual encurta a cadeia de caracteres.
Modificando a cadeia de caracteres do StringBuilder
A tabela a seguir lista os métodos que você pode usar para modificar o conteúdo de um StringBuilder.
Nome do método | Utilizar |
---|---|
StringBuilder.Append | Acrescenta informações ao final do StringBuilder atual. |
StringBuilder.AppendFormat | Substitui um especificador de formato passado em uma cadeia de caracteres por texto formatado. |
StringBuilder.Insert | Insere uma cadeia de caracteres ou objeto no índice especificado do StringBuilder atual. |
StringBuilder.Remove | Remove um número especificado de caracteres do StringBuilder atual. |
StringBuilder.Replace | Substitui todas as ocorrências de um caractere especificado ou cadeia de caracteres no StringBuilder atual por outro caractere ou cadeia de caracteres especificado. |
Acrescentar
O método Append pode ser usado para adicionar texto ou uma representação de cadeia de caracteres de um objeto ao final de uma cadeia de caracteres representada pelo StringBuilder atual. O exemplo a seguir inicializa um StringBuilder para "Hello World" e, em seguida, acrescenta algum texto ao final do objeto. O espaço é alocado automaticamente conforme necessário.
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
O StringBuilder.AppendFormat método adiciona texto ao final do StringBuilder objeto. Ele suporta o recurso de formatação composta (para obter mais informações, consulte Formatação composta) chamando a IFormattable implementação do objeto ou objetos a serem formatados. Portanto, ele aceita as cadeias de caracteres de formato padrão para valores numéricos, de data e hora e de enumeração, as cadeias de caracteres de formato personalizado para valores numéricos e de data e hora e as cadeias de caracteres de formato definidas para tipos personalizados. (Para obter informações sobre formatação, consulte Tipos de formatação.) Você pode usar esse método para personalizar o formato de variáveis e acrescentar esses valores a um StringBuilderarquivo . O exemplo a seguir usa o AppendFormat método para colocar um valor inteiro formatado como um valor de moeda no final de um StringBuilder objeto.
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
Inserir
O Insert método adiciona uma cadeia de caracteres ou objeto a uma posição especificada no objeto atual StringBuilder . O exemplo a seguir usa esse método para inserir uma palavra na sexta posição de um StringBuilder objeto.
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!
Remover
Você pode usar o método Remove para remover um número especificado de caracteres do objeto atual StringBuilder , começando em um índice baseado em zero especificado. O exemplo a seguir usa o método Remove para encurtar um StringBuilder objeto.
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
Replace
O método Replace pode ser usado para substituir caracteres dentro do StringBuilder objeto por outro caractere especificado. O exemplo a seguir usa o método Replace para pesquisar um StringBuilder objeto para todas as ocorrências do caractere de ponto de exclamação (!) e substituí-las pelo caractere de ponto de interrogação (?).
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?
Convertendo um objeto StringBuilder em uma cadeia de caracteres
Você deve converter o StringBuilder objeto em um String objeto antes de poder passar a cadeia de caracteres representada pelo StringBuilder objeto para um método que tenha um String parâmetro ou exibi-lo na interface do usuário. Você faz essa conversão chamando o StringBuilder.ToString método. O exemplo a seguir chama vários métodos e, em seguida, chama o StringBuilder.ToString() método para exibir a cadeia de StringBuilder caracteres.
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