A immutabilidade string define que uma objeto do tipo string não pode ter seu valor alterado. É isso mesmo, strings não podem mudar seu valor.

 

Como trabalhamos com strings

Naturalmente trabalhamos uma soma de strings desta forma:

string Nome = "João"; // Definimos e atribuimos valor a um objeto string

Nome += " Pereira"; // Efetuamos uma operação de adição a um objeto string

O que à de errado nisso?

Na CLR não é bem assim, uma string é uma sequencia de caracteres unicode, logo após sua criação ela se torna only read e ao trocarmos seu valor uma nova sequencia é criada dando origem a um novo objeto, deixando o objeto anterior sem referência ele vai para o garbage collector.

Para operações como dado o exemplo acima onde criamos um objeto Nome, do tipo string e inicializamos o seu valor e logo em seguida adicionamos um sobrenome não sentimos diferença na performance da aplicação, mais imaginem repetir esta operação um milhão de vezes dentro de um laço de repetição.

Devido a este fato operações com string são tão custosas, devido a esta particularidade do funcionamento de strings que foi criado a classe StringBuilder que otimiza estas operações.

Temos outras formas de trabalhar com strings, uma delas é o string.Format() que facilita a formatação de textos onde podemos parametrizar informações para uma string.

Seguem exemplos:

 

Caso 01: operação onde existe multiplas adicições em uma string:

StringBuilder sb = new StringBuilder();
for (int i = 0; i >= int.MaxValue; i++) //int.MaxValue, constante da classe int32 de valor 2147483647
{
     sb.Append(i.ToString());
}
sb.ToString(); 

 

Caso 02: operação onde existe a necessidade de formatar uma informação qualquer

string Nome = "João";

string Sobrenome = "Pereira";

string NomeCompleto = string.Format("{0} {1}",Nome, Sobrenome);

 

Bom quando forem realizar operações que envolvam strings e alterações sobre elas, trabalhem com o StringBuilder e ou string.Format(), para obterem uma performance melhor em seus aplicativos, além de estarem escrevendo um código muito mais elegante.

Para saber mais:
csharphelp - Strings are Immutable
msdn - system.string
msdn - system.string - Immutability
Noções básicas de seqüência de caracteres (guia de programação tran...
DevBrasil - C# (Csharp)

Exibições: 411

Comentar

Você precisa ser um membro de DevBrasil para adicionar comentários!

Entrar em DevBrasil

Comentário de Henrique Clausing Cunha em 9 dezembro 2011 às 7:19

Pois é, e eu nem imaginava isso,


Belo artigo amigo! Parabéns.

 

Vou providenciar ainda hoje as alterações necessárias.

Comentário de Rafael Silva dos Anjos em 5 dezembro 2011 às 8:30

Obriagado à todos pelas dicas de melhorias, hoje mesmo estarei providenciando-as, obridago Ramon pelo incentivo, obrigado Diogo pelas primeiras aulas .net...

Abraços

Comentário de Diogo Costa Santos em 5 dezembro 2011 às 8:27

Olha o Monstro que eu criei! 

rssrs parabéns Rafael.

Comentário de Vitório Ramon em 2 dezembro 2011 às 9:09

Rafael, 

Obrigado pelo artigo, saber disso vai me quebrar um ganho danado.

Uma correção precisa ser feita no seguinte código:

StringBuilder sb = new StringBuilder();
for (int i = 0; i >= int.MaxValue; i++)
{
     sb.Append(i.ToString());
}
sb.ToString(); 

Faltou o executar o método Append (ou uma de suas variações) da instância do StringBuilder.

Obrigado e parabéns pelo artigo. E como meu xará disse que seja o primeiro de muitos.

Comentário de Yan de Lima Justino em 30 novembro 2011 às 20:44

Parabéns, Rafael. Esse tipo de artigo é muito importante.

Comentário de Ramon Durães em 30 novembro 2011 às 14:34

Rafael,
Parabéns pela iniciativa do primeiro artigo. Que muitos outros viram em frente. Você tocou em um assunto muito interessante que acaba passando em branco. Como já citado pelo Jone. Pode complementar com o conceito "Boxing and Unboxing". Vamos em frente mestre!!!!
[], 

Comentário de Rafael Silva dos Anjos em 30 novembro 2011 às 13:19

Galera obrigado pelos comentários, Jone excelente sua observação, vou rectificar o artigo. Obrigado.

Esse foi o primeiro, logo perco e vergonha e posto mais. Abraços

Comentário de Márcio Araújo em 30 novembro 2011 às 11:13

Muito massa  Rafael Silva, bom artigo.

Comentário de Rafael Martins em 30 novembro 2011 às 9:35

 

Faça o seguinte teste, mesmo em uma página web qualquer. coloque uma string num loop "for(int i = 0, i < 100000; i++)" e em cada repetição o concatente sua string com o o valor corrente de " i ". mas antes imprima "DateTime.Now" e outra vez após o laço.

 

Aqui, num página asp.net rodando no wevmatrix, levou cerca de 3 minutos e 15 segundos, prém com StringBuilder, foi apenas 1 segundo.

 

Comentário de Jone Pólvora em 30 novembro 2011 às 7:51

Uma ressalva deve ser feita, a concatenação de strings é custosa não porque ela apaga a string anterior, como foi dito no artigo, mas sim pelo fato de que um novo objeto é criado na memória, e a variável que guarda a referência para a string passa a apontar para o novo objeto resultante da operação, e o objeto anterior fica sem referência, dando mais trabalho para o Garbage Collector que terá que fazer a limpeza desses objetos sem referência alguma.

© 2019   Criado por Ramon Durães.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço