Olá, José. Tudo bom com você?
No caso do uso de strings com Remove, se é usada internamente a troca de uma string por uma nova e um apontamento da variável da antiga para o objeto novo, isso é feito internamente no C#?
Se não for assim, um método iterativo, como um While, pode encher a memória de objetos largados pra trás. Como garantir que o objeto String antigo foi destruído?
- Não temos essa garantia! De qualquer modo, o garbage collector do C# é bastante esperto e neste tipo de situação ele vai limpar a memória.
Não deveríamos ter um destrutor sobrescrevendo o original?
Nesta série de curso não abordamos o assunto de destrutores/finalizadores. A boa prática é não os utilizar.
No C# não é possível ativamente remover um objeto da memória, quem sempre faz isto é o GC e não sabemos quando que isto acontece.
Já que é assim, qual seria o sentido da existência dos destrutores/finalizadores no C#? Em alguns cenários bem específicos, você vai querer executar algum código quando o GC remover um objeto da memória do computador. Esta abordagem é usada em códigos críticos, porque apesar de existir o padrão de disposables, ainda é possível que a pessoa não execute o código de um IDisposable
em um bloco using
ou que chame o método Dispose
.
Mas... Destrutores são realmente estranhos:
- Não podemos prever quando são executados;
- Às vezes o objeto sai da memória e o GC não executa o finalizer;
- Não fazemos ideia do estado do objeto quando o finalizer é executado. Talvez as propriedades do objeto já tenham sido removidas da memória e você não poderá acessar;
- Existe um limite de tempo para a execução do finalizer, que é diferente para algumas versões do .NET;
- Não sabemos em qual thread o finalizer está sendo executado;
- Finalizers podem "ressuscitar" um objeto e fazer o GC mudar de ideia sobre o remover da memória!
É um assunto bastante complexo que fica fora do escopo dessa série de cursos. Para entender a fundo todos os por quês da complexidade dos finalizadores o material dessa série também não será o suficiente, mas, se depois você quiser se aprofundar em como o .NET funciona por dentro e essa questão do garbage collector e finalizadores, eu conheço e recomendo os dois livros a seguir (infelizmente somente em inglês):