DESTRUIR CLASSE
Boa tarde, Pessoal!
Gostaria de saber qual a melhor forma de destruir / liberar classes e objetos da memoria, utilizando VB.NET.
Obrigado.
Gostaria de saber qual a melhor forma de destruir / liberar classes e objetos da memoria, utilizando VB.NET.
Obrigado.
Veja isso:
http://www.macoratti.net/vbn5_dpo.htm
http://www.macoratti.net/vbn5_dpo.htm
Citação::
Veja isso:
http://www.macoratti.net/vbn5_dpo.htm
Ok
No entanto, gostaria de saber se a expressão abaixo está correta, atrair NOTHING ao final do processo é correto? Ou existe uma prática mais correta?
try
dim obj as new classe_X
obj.codigo = 1
obj.nome = [Ô]TESTE[Ô]
obj.InserirRegistroBD()
obj = nothing
Catch ex As Exception
Throw ex
End Try
Se sua intenção é liberar recursos num exato momento, utilize o Dispose para isso. Agora, se você quer apenas liberar recursos sem saber exatamente o momento que isso ocorrerá, você pode utilizar o Nothing como no teu exemplo. Com isso temos:
[ô]Deixa que o coletor de lixo fique responsável por fazer a limpeza.
obj = nothing
ou
[ô]Libera os recursos no instante da execução
obj.Dispose()
[ô]Deixa que o coletor de lixo fique responsável por fazer a limpeza.
obj = nothing
ou
[ô]Libera os recursos no instante da execução
obj.Dispose()
Cara,
Eu sempre utilizo o [txt-color=#0000f0]Implements IDisposable[/txt-color]:
Para usar a classe, eu faço:
Eu sempre utilizo o [txt-color=#0000f0]Implements IDisposable[/txt-color]:
Public Class Classe1
Implements IDisposable
Public Sub New()
End Sub
Public ReadOnly Property mostraExemplo() As String
Get
Return [txt-color=#e80000][Ô]Este é um exemplo de classe.[Ô][/txt-color]
End Get
End Property
End Class
Para usar a classe, eu faço:
[txt-color=#0000f0]Using[/txt-color] objClasse As New Classe1
MsgBox(ObjClasse.mostraExemplo)
End [txt-color=#0000f0]Using[/txt-color]
Neste caso não faz diferença.
Como é uma variável local ela não vai mais existir quando sair de escopo, o resultado é basicamente o mesmo.
Agora se quer saber o maior erro nesse seu trecho de código é o tratamento de erros, ele não deveria existir já que você não faz nada com ele, e mesmo que fizesse nunca use algo do tipo [Ô]Throw ex[Ô], quando precisar simplesmente use [Ô]Throw[Ô] sem nada, pois o primeiro modo ele substitui os detalhes da stack e faz como se a exception tenha sido originado desta linha, enquanto o segundo modo mantém os detalhes da stack fazendo com que a origem da exception continue a mesma.
Como é uma variável local ela não vai mais existir quando sair de escopo, o resultado é basicamente o mesmo.
Agora se quer saber o maior erro nesse seu trecho de código é o tratamento de erros, ele não deveria existir já que você não faz nada com ele, e mesmo que fizesse nunca use algo do tipo [Ô]Throw ex[Ô], quando precisar simplesmente use [Ô]Throw[Ô] sem nada, pois o primeiro modo ele substitui os detalhes da stack e faz como se a exception tenha sido originado desta linha, enquanto o segundo modo mantém os detalhes da stack fazendo com que a origem da exception continue a mesma.
@JABBA
Isso não está correto, Dispose não garante liberação no instante da execução, ele é dependente da implementação e a classe em si que implementa ele continua na memória para ser coletada pelo GC.
No geral Dispose vai liberar no momento que for chamado os recursos não gerenciados, por exemplo ao usar um objeto Bitmap ele possui internamente referencias a objetos do GDI+, esses objetos são nativos então quando chamado Dispose a classe Bitmap finaliza os objetos do GDI+ que usou para liberar estes recursos, porém a classe Bitmap vai continuar na memória para ser coletada pelo GC.
@PEGUDO
Isso também não faz sentido, você não está liberando nada ao implementar ele. Usar o IDisposable só faz sentido se você precisa liberar algo, e apenas se este algo for não gerenciado ou forem outros objetos que implementem o IDisposable.
Por exemplo se você criou uma classe que usa diretamente a API do Windows e ela precisa que você execute uma certa função no final para liberar os recursos da API então deve usar o IDisposable e fazer essa chamada no final.
Citação:Deixa que o coletor de lixo fique responsável por fazer a limpeza.
obj = nothing
ou
[ô]Libera os recursos no instante da execução
obj.Dispose()
Isso não está correto, Dispose não garante liberação no instante da execução, ele é dependente da implementação e a classe em si que implementa ele continua na memória para ser coletada pelo GC.
No geral Dispose vai liberar no momento que for chamado os recursos não gerenciados, por exemplo ao usar um objeto Bitmap ele possui internamente referencias a objetos do GDI+, esses objetos são nativos então quando chamado Dispose a classe Bitmap finaliza os objetos do GDI+ que usou para liberar estes recursos, porém a classe Bitmap vai continuar na memória para ser coletada pelo GC.
@PEGUDO
Citação:Cara,
Eu sempre utilizo o [txt-color=#0000f0]Implements IDisposable[/txt-color]
Isso também não faz sentido, você não está liberando nada ao implementar ele. Usar o IDisposable só faz sentido se você precisa liberar algo, e apenas se este algo for não gerenciado ou forem outros objetos que implementem o IDisposable.
Por exemplo se você criou uma classe que usa diretamente a API do Windows e ela precisa que você execute uma certa função no final para liberar os recursos da API então deve usar o IDisposable e fazer essa chamada no final.
Caso ainda queira forcar o GC, bem simples ate, se procurar mo msdn encontra como fazer tmb
http://www.vb-helper.com/howto_net_force_gc.html
http://www.vb-helper.com/howto_net_force_gc.html
Faça seu login para responder