- Você tem o hábito de concatenar strings assim?
Se a resposta é sim, quero apresentar a você um cara chamado StringBuilder. Da "família", digo, Namespace System.Text.string _texto = "Alisson ";
_texto += " Rodrigo";
_texto += " de Santana";
_texto += " Blog";
_texto += " Micosoft";
_texto += " Spaces"
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:
Postar um comentário