As classes mais utilizadas, sem dúvida, são "String" e "StringBuilder". Cada uma delas apresenta particularidades com relação a criação de objetos na memória, principalmente no relacionamento com as variáveis de referência destes objetos.
Como nós já sabemos, strings são IMUTÁVEIS. Isto significa dizer que, após feita uma atribuição de valor para uma variável do tipo "string" nunca mais poderemos alterar aquele valor. Mas então o que aconteçe quando, constantemente, nos deparamos com um código como o abaixo ?
string teste = "abc";
teste = teste + "def";
Neste exemplo simples, a linha1 cria um objeto string na memória, com o valor "abc", e faz a variável de referência "teste" apontar para o endereço de memória onde o objeto foi criado. Vamos supor que tenha sido criado no endereço de memória #001.
Na segunda linha alteramos o valor da string criada na linha1. É exatamente neste ponto que se concentra toda a discussão e confusão sobre o tema de imutabilidade. Após a linha2 a variável "teste" ficará com o valor "abcdef", porém, este novo valor estará em uma nova área de memória que foi alocada automaticamente quando você concatenou o valor antigo da string "abc" com o valor "def".
3 coisas muito importantes aconteceram neste ponto:
1 - Um novo endereço de memória foi criado, por exemplo #030, e atribuido a ele o valor "abcdef";
2 - A variável de referência "teste" passou a apontar para este novo endereço de memória;
3 - Portanto, o endereço de memória #001 fica sem ter nenhuma referência apontando para ele, e ninguém mais irá conseguir alcancá-lo. Ele se torna elegível para ser retirado da memória através de um processo automático do framework conhecido como "Garbage Collector"
Agora vamos supor o segiunte cenário:
string s1 = "abc";
string s2 = s1;
s2 = "123";
Este cenário é parecido com o anterior, porém, neste caso não ficamos com um endereço de memória inalcanssável. Vejamos o passo-a-passo resumido do que aconteçeu:
1 - É alocado um novo endereço de memória, por exemplo #050, para a variavel de referência s1;
2 - É declarada uma nova variavel s2, que aponta para o mesmo endereço de memória de s1;
3 - s2 deixa de apontar para o endereço de memória #050 e passa a apontar para um novo endereço de memória que foi alocado automaticamente, por exemplo #052, quando o valor "123" foi atribuido à variàvel s2.
4 - s1 continua apontando para seu endereço de memória de origem, #050, com o mesmo valor "abc"
Veja abaixo o gráfico do cenário descrito acima. Esta imagem foi retirada da revista "easyJava, número 1, edição 1".
Sempre que você precisar fazer muitas concatenações com strings dê preferência ao objeto StringBuilder, pois ele consegue alocar um único endereço de memória e "crescer" de forma dinâmica conforme você vai "concatenando" mais strings. Veja abaixo um exemplo.
StringBuilder sb = new StringBuilder();
sb.Append("abc");
sb.Append("def");
sb.Append("ghi");
string teste = sb.ToString();
Não deixem de conferir os exemplos práticos na vídeo-aula abaixo:

Nenhum comentário:
Postar um comentário