quarta-feira, 6 de fevereiro de 2008

Usando StringBuilder para concatenar Strings

- Você tem o hábito de concatenar strings assim?


string _texto = "Alisson ";
_texto += " Rodrigo";
_texto += " de Santana";
_texto += " Blog";
_texto += " Micosoft";
_texto += " Spaces"

Se a resposta é sim, quero apresentar a você um cara chamado StringBuilder. Da "família", digo, Namespace System.Text.

Primeiro quero explicar o por que não usarmos o "shorthand" += para se concatenar strings.

Toda vez que se atribui um valor a uma variável string, um objeto novo é criado na memória. E quando você concatena uma string a esta variável, um novo objeto novamente é criado para armazenar o resultado da concatenação!


Por que? Eu te digo: - o tipo System.String é imutável!!! Você não consegue mudá-lo uma vez atribuído seu valor.


Com isso, pra que o resultado do shorthand "+=" aconteça, o sistema cria um novo objeto para receber o resultado da concatenação.

Você me pergunta: "- E o valor inicial da variável?" Sim. Ele permanece na memória. E orfão, coitado. Ele é um valor inútil que um dia pertenceu a variável e só serviu para ser jogado para o novo objeto que agora armazena a string antiga mais o valor que você pediu pra ser concatenado.

Agora que você sabe como as coisas acontece "behind the scenes" (por baixo dos panos, na versão tupiniquim), imagine o seguinte:

string numeros = string.Empty;

for(int
i = 0; i < 1000; i++)
{
numeros += + i.ToString();
}

Isso geraria um overhead totalmente desnecessário ao sistema. 999 objetos ficariam orfãos e ocupando espaço na memória e somente o último, o de número 1000, seria o utilizado.

E então, como evitar isso? Usando o StringBuilder que lhes apresentei no início do texto.

O código acima, utilizando-se o StringBuilder, ficaria assim:

StringBuilder numeros = new StringBuilder(1000);

for(int i = 0; i<1000; i++)
{
numeros.Append(i.ToString());
}

Dessa forma, cada valor adicionado ao objeto irá ser armazenado num único lugar da memória. Num único endereço, que é o do próprio objeto.

No final da iteração, podemos obter o valor do resultado chamando o método ToString() do StringBuilder. E fazendo isso também não iremos criar uma nova String. Este método retorna uma instância que aponta para a String dentro do objeto.

"Ah. Agora vou usar sempre o StringBuilder ao invés de usar String".

Não. Cada caso é um caso. Não exclua dos seus planos utilizar a concatenação de strings usando "+=".
Recomendo que se use o StringBuilder em casos que necessitem quatro ou mais concatenações.

Referência: http://msdn2.microsoft.com/en-us/library/system.text.stringbuilder.aspx

Por enquanto é só, pessoal.


Nenhum comentário: