VB .NET - StringBuilder : tratando Strings de modo mais eficiente.


Já tivemos a oportunidade de falar um pouco sobre Strings no VB.NET no artigo - VB.NET - Strings um novo enfoque ; neste artigo vou falar um pouco da classe StringBuilder , suas propriedades e como usá-la para otimizar o tratamento de Strings , afinal , creio que as Strings sejam uma das classes mais usadas no VB.NET.

 

Toda vez que você usa um dos métodos da classe System.String , você cria um novo objeto string na memória , o qual requer uma nova alocação de espaço para o objeto criado. Em situações onde você precisa realizar repetidas modificações em uma string a sobrecarga de ter que criar um novo objeto String pode lhe trazer problemas. Nestas situações é que entra a classe StringBuilder ,  ela faz parte do namespace System.Text ; então a classe System.Text.StringBuilder pode ser usada para modificar uma string sem que seja necessário criar um novo objeto. Por exemplo a concatenação de strings em um loop pode ser uma destas situações onde o uso de StringBuilder pode melhorar muito o desempenho do seu código.

 

Podemos pensar no objeto StringBuilder como um buffer dinâmico que pode conter uma String com a habilidade de aumentar seu tamanho a partir do zero até a capacidade final do buffer. O tamanho do buffer vai crescendo a medida que o tamanho dos caracteres presentes no objeto StringBuilder vai aumentando.

 

Podemos definir um número máximo de caracteres que o objeto StringBuilder pode manipular . Este valor é chamado de capacidade do objeto e não pode ser confundido com o comprimento da string contida no objeto atual.  Por exemplo podemos criar um instância da classe StringBuilder com a string "Macoratti" que possui um tamanho de 9 , e ao mesmo tempo podemos definir a capacidade máxima do objeto como sendo de 25. Ao modificar o objeto StringBuilder , ele não faz a realocação de tamanho até que a capacidade máxima seja alcançada ; quando isto ocorre novo espaço é alocado automaticamente e a capacidade dobra de tamanho. Vejamos como podemos criar um objeto StringBuilder :

 

  1. Dim MeuStringBuilder As New StringBuilder("Hello World!", 25) - cria um objeto sb do tipo StringBuilder com a capacidade de 25 caracteres
  2. Dim sb As New System.Text.StringBuilder(1000)      - cria um objeto sb do tipo StringBuilder com a capacidade de 1000 caracteres

A classe System.Text.StringBuilder obtém uma melhor performance no tratamento de strings justamente porque ela aloca o espaço inicial quando uma instância do objeto é criada.  O tamanho padrão inicial é de 16 caracteres na memória quando usamos o construtor da classe sem argumento algum:

Ex:     Dim sb As New System.Text.StringBuilder()

O tamanho de um objeto StringBuilder pode ser obtido pela propriedade Capacity. Assim para obter o tamanho do objeto sb acima fazermos:

Ex:    System.Console.WriteLine(sb.Capacity)   ' irá imprimir 16 , que é o tamanho padrão inicial

Para alterar a capacidade do objeto StringBuilder também usamos a propriedade Capacity . Para alterar o tamanho do objeto StringBuilder acima, fazemos :

Ex:    sb.Capacity = 25    - aumenta para 25 caracteres a capacidade máxima do objeto sb

Os métodos abaixo podem ser usados para modificar o conteúdo de um objeto StringBuilder:

Nome do Método Uso
StringBuilder.Append Anexa uma informação no final do objeto StringBuilder atual. Ex:( Anexa a frase - Que lindo dia a string Olá Mundo)

Dim MeuStringBuilder As New StringBuilder("Olá Mundo!")
MeuStringBuilder.Append(" Que lindo dia.")
Console.WriteLine(MeuStringBuilder)

Resultado => Olá Mundo! Que lindo dia.

StringBuilder.AppendFormat Anexa texto no final do objeto StringBuilder e realiza a formatação. Ex: (Formata a saida na moeda local)

Dim MeuInt As Integer = 25
Dim MeuStringBuilder As New StringBuilder("O total é : ")
MyStringBuilder.AppendFormat("{0:C} ", MeuInt)
Console.WriteLine(MyStringBuilder)

Resultado => O total é R$25.00

StringBuilder.Insert Inclui uma string ou objeto numa posição específica de um objeto StringBuilder atual. Ex:(Inclui a palavra Carlos entre Jose Macoratti)

Dim MeuStringBuilder As New StringBuilder("Jose  Macoratti")
MeuStringBuilder.Insert(6, " Carlos ")
Console.WriteLine(MeuStringBuilder)

Resultado => Jose Carlos Macoratti

StringBuilder.Remove Exclui um número específico de caracteres de um objeto StringBuilder. Ex: (Remove a palavra Jose)

Dim MeuStringBuilder As New StringBuilder("Jose Macoratti")
MeuStringBuilder.Remove(0, 4)
Console.WriteLine(MeuStringBuilder)

Resultado => Macoratti

StringBuilder.Replace Substitui caracteres em um objeto StringBuilder atual. Ex: (Substituir todas as ocorrências de ! por ?)

Dim MeuStringBuilder As New StringBuilder("Olá Pessoal !")
MeuStringBuilder.Replace("!"c, "?"c)
Console.WriteLine(MeuStringBuilder)

Resultado => Olá Pessoal ?

StringBuilder.AppendLine Inclui uma linha no objeto StringBuilder.

Vejamos agora as principais propriedades do objeto StringBuilder:

Propriedade Definição
Capacity Define ou obtém o número máximo de caracteres que pode ser armazenado na memória alocada do objeto StringBuilder.
Chars Define ou obtém um conjunto de caracteres a partir de uma posição definida na string contida no StringBuilder.
Length Obtém ou define o comprimento da instância do objeto StringBuilder.
MaxCapacity Obtém a capacidade máxima da instância do StringBuilder.

Exemplo:

1- Obtendo a capacidade e o tamanho da string no StringBuilder. Usando as propriedades : Capacity e Length.

Dim sb As New System.Text.StringBuilder("12345678901234567890")

System.Console.WriteLine(sb.Capacity)    ' imprime 32
System.Console.WriteLine(sb.Length)       ' imprime 20

Nota: Você percebeu que no exemplo acima o objeto StringBuilder - sb - foi iniciado com 20 caracteres. Então porque obtivemos como capacidade o valor de 32 ?  Como a capacidade inicial de um StringBuilder é de 16 caracteres e você atribuiu 20 caracteres , objeto imediatamente dobra o tamanho para acomodar o string. (16 x 2) . Se você inicia-se com 33 caracteres o tamanho seria aumentando para 64 ( 32 x 2).

2- Acessando e escrevendo caracteres individuais em uma StringBuider . Para fazer isto usamos a propriedade Chars . (começa na posição 0)


Dim sb As New System.Text.StringBuilder("Macoratti")
System.Console.WriteLine(sb.Chars(0))   ' imprime a letra M

A propriedade Chars é muito flexível pois é read-write .(A propriedade Chars da classe String é read-only). Podemos então usar Chars para escrever caracteres em um string. Veja :

    Dim sb As New System.Text.StringBuilder("dingdong")
        sb.Chars(0) = "p"c
        sb.Chars(4) = "p"c
    System.Console.WriteLine(sb)   ' imprime pingpong
    sb.Chars(0) = "k"c
        sb.Chars(4) = "k"c
        System.Console.WriteLine(sb)   ' imprime kingpong

Para terminar vamos construir uma string usando o objeto StringBuilder. Nossa string deverá conter os números naturais de 0 a 100 e no início da string vamos escrever as palavras :  "Lista de números naturais de 1 a 100 : "

- Inicie o Microsoft Visual Studio .Net 7.0 e abra um novo projeto selecionando - New Project.

2- Na janela New Project Selecione em Project Type : Visual Basic Projects e em Templates: Console Application . Vamos dar o nome ao nosso projeto de StringBuilder_1. No final clique em OK. A seguir digite o código abaixo na rotina sub Main.

Module Module1

 

  Sub Main()

 

    Dim sb As New System.Text.StringBuilder(200)

  Dim n As Integer

 

    For n = 1 To 100

    ' Usamos dois métodos Append porque assim é mais rápido

      sb.Append(n)

       If n < 100 Then

            sb.Append(",")    'não inclui uma , depois do número 100

         End If

   Next

  ' inclui a string no inicio do buffer

  sb.Insert(0, "Lista de número naturais de 1 a 100 : ")

 

  Console.WriteLine(sb) ' => Lista de número naturais de 1 a 100: 1,2,3,4,5,6,...

  Console.ReadLine()

End Sub

End Module

O resultado da impressão da string montada pelo StringBuilder é :

Este código chega a ser 100 vezes mais rápido do que um código usando a classe String para obter o mesmo resultado.

Por enquanto é só , vamos continuar falando de strings no VB.NET em um outro artigo...


Veja os Destaques e novidades do SUPER DVD VB (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#
 

   Gostou ?   Compartilhe no Facebook    Compartilhe no Twitter

Referências:


José Carlos Macoratti