DESTRUIR CLASSE

TIAGOFAC 09/03/2015 14:35:08
#445091
Boa tarde, Pessoal!

Gostaria de saber qual a melhor forma de destruir / liberar classes e objetos da memoria, utilizando VB.NET.

Obrigado.
JABA 09/03/2015 14:39:38
#445092
Veja isso:

http://www.macoratti.net/vbn5_dpo.htm
TIAGOFAC 10/03/2015 09:08:54
#445114
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
JABA 10/03/2015 11:41:36
#445119
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()

PEGUDO 10/03/2015 11:41:54
#445120
Cara,
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]

OCELOT 10/03/2015 11:43:09
#445121
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.
OCELOT 10/03/2015 11:54:34
#445124
@JABBA
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.
NICKOSOFT 11/03/2015 04:48:52
#445142
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
Faça seu login para responder