Olá pessoal, nesse artigo vou apresentar a classe TStringBuilder que foi implementada a partir do Delphi 2009 e veio para “melhorar” a manipulação de strings. Na maioria das vezes a manipulação de strings tais como concatenação gera um certo ônus tanto para o compilador como para memória, então a partir do Delphi 2009 foi implementada a classe TStringBuilder que segundo consta na documentação veio para melhorar essa questão.

Não vou me preocupar muito com os detalhes sobre ganho de performance entre o método de concatenação normal e usando a classe TStringBuilder, até porque existe muita discordância dentro da comunidade Delphi sobre se existe vantagens e até que ponto é viável o uso dessa nova classe.

O que realmente temos de interessante é na questão do método Append, que é sobrecarregado para aceitar a inserção de diversos tipos de dados, desde strings até pontos flutuantes, sem a necessidade de especificar um tipo de conversão explicita. Na figura 1 segue a relação de tipos aceitáveis pelo método Append.

Outra coisa interessante é na questão da escrita e entendimento do código que se torna mais legível para compreensão, pois no método normal de concatenação usamos vários “+” dependendo da quantidade se torna um pouco cansativo até para manutenção do código.

Exibe os tipos de dados que o método Append aceita

Figura 1: Exibe os tipos de dados que o método Append aceita.

Vou exibir algumas comparações do modo normal e usando a classe TStringBuilder, sempre lembrando que antes de utilizar essa classe temos que instanciá-la, pois iremos trabalhar com um objeto da classe TStringBuilder.

Abaixo segue 2 exemplos de concatenações de strings, listagem 1 usando o modo normal com o operador ‘+’ e a listagem 2 usando um objeto do tipo TStringBuilder.

Listagem 1: Exemplo de concatenação de strings usando o ‘+’.


var
  str: string;
begin
     str := str + 'DevMedia';
end;
  

Listagem 2: Exemplo de concatenação de strings usando TStringBuilder.


var
  str: TStringBuilder;
begin
     try
        str := TStringBuilder.Create;
        str.Append('DevMedia');
     finally
        FreeAndNil(str);
     end;
end; 
  

Observação: Notem que o código foi escrito dentro de um bloco try..finally..end, como estamos instanciando um objeto somos responsáveis por descarregá-lo após a execução do bloco de código, sendo assim o bloco finally se encarrega desta tarefa.

Abaixo vou mostrar como concatenar um ponto flutuante à cadeia de strings usando método normal listagem 3 e sem a necessidade de conversão explicita usando a classe TStringBuilder listagem 4.

Listagem 3: Exemplo de concatenação de um valor double no modo normal.


var
   ValorDouble: Double;
   Str : string;
begin
     ValorDouble := 12.11;
     Str := Str + FloatToStr(ValorDouble);

     ShowMessage(Str);
end;
  

Listagem 4: Exemplo de concatenação de um valor double usando TStringBuilder.


var
   Str: TStringBuilder;
   ValorDouble: Double;
begin
    try
        ValorDouble := 12.11;
        Str := TStringBuilder.Create;
        Str.Append(ValorDouble);

        ShowMessage(Str.ToString);
    finally
        FreeAndNil(Str);
    end;
end;
  

Observação: Note que não foi necessário nenhuma conversão do valor double para string, o próprio método Append se encarrega da conversão. A função ToString faz a conversão do conteúdo StringBuilder para strings.

Mas a classe TStringBuilder possui outros métodos interessantes de se analisar, entre eles vale a pena citar:

  • AppendFormat();:Método muito semelhante ao Format já existente no Delphi.
  • AppendLine();:Inseri uma linha vazia no conteúdo do objeto.
  • Clear;:Limpa o conteúdo do objeto.
  • Replace();:Substitui substring no conteúdo do objeto.
  • ToString;:Converte o conteúdo StringBuilder para string.

Bom pessoal esse artigo na verdade foi um overview sobre a classe TStringBuilder, com ela podemos manipular strings facilmente e com a possibilidade de escrever um código mais legível, seus métodos são muito semelhantes aos que já existem na VCL. Como citei no início e pesquisei sobre o assunto, existe a idéia de que, com o uso dessa classe pode haver um ganho de performance, mas existe muita divergência sobre o assunto, então ficamos com a praticidade do método Append e com o fácil entendimento do código.

Espero que tenham apreciado, com isso finalizo mais um artigo e até a próxima.

Um Abraço.