Destructor en VB .NET

22/07/2004 - 14:11 por Jordi | Informe spam
Hola a todos, cómo estáis ?

Tengo un problema con un destructor. Es muy simple:

Tengo una clase llamada CConstantes con un constructor y
un destructor:

Public Sub New(masCst as string)
...
End Sub

Protected Overloads Overrides Sub Finalize()
MsgBox("Destructor Collection")
...
End Sub

Desde el programa principal, al hacer click sobre un botón:

Sub Click
Dim mloConstantes as New CContantes("Cadena")
...
End Sub

El problema es que al finalizar el ámbito del Click (End
Sub), NO me ejecuta el Destructor automáticamente (me lo
ejecuta automáticamente al finalizar la aplicación).

Cómo puedo crear un DESTRUCTOR, que al finalizar su ámbito
de uso, se ejecute automáticamente ? Lo he intentado con
Dispose y no hay manera.

Muchas gracias.

Preguntas similare

Leer las respuestas

#1 Pedro Luna Montalvo
22/07/2004 - 16:31 | Informe spam
Saludos:

Busca mayor informacion sobre el "Colector de Basura", "Garbage Collector",
y patrones de implementacion de "IDisposable" para que entiendas la
administracion de memoria de los objetos .NET.

La memoria de los objetos no es liberada de inmediato, necesariamente,
cuando los objetos no son referenciados por nadie. En su lugar, un proceso
de baja prioridad, precisamente el Colector de Basura, cada cierto tiempo, o
cuando el uso de memoria es elevado, liberara esta memoria.

El destructor de los objetos es invocado precisamente por el Colector, justo
antes de reclamar la memoria que utiliza, por eso es critico el tipo de
codigo que colocas ahi, para no bloquear el hilo del recolector.

El metodo Dispose, permite que tu objeto libere recursos criticos antes de
que el mismo sea destruido, es decir, que permites que el objeto libere los
recursos que esta usando, precisamente porque no tenemos certeza del tiempo
que transcurra hasta que se ejecute propiamente el destructor.

Si quieres que en algun momento el colector libere toda la memoria usada por
objetos fuera de ambito, puedes usar:

GC.Collect() ' Solicitar la recolección
GC.WaitForPendingFinalizers() ' Esperar a que se libere todo

Saludos
Pedro Luna, MVP
Gye, Ecu


"Jordi" escribió en el mensaje
news:1eb301c46fe4$f771e640$
Hola a todos, cómo estáis ?

Tengo un problema con un destructor. Es muy simple:

Tengo una clase llamada CConstantes con un constructor y
un destructor:

Public Sub New(masCst as string)
...
End Sub

Protected Overloads Overrides Sub Finalize()
MsgBox("Destructor Collection")
...
End Sub

Desde el programa principal, al hacer click sobre un botón:

Sub Click
Dim mloConstantes as New CContantes("Cadena")
...
End Sub

El problema es que al finalizar el ámbito del Click (End
Sub), NO me ejecuta el Destructor automáticamente (me lo
ejecuta automáticamente al finalizar la aplicación).

Cómo puedo crear un DESTRUCTOR, que al finalizar su ámbito
de uso, se ejecute automáticamente ? Lo he intentado con
Dispose y no hay manera.

Muchas gracias.
Respuesta Responder a este mensaje
#2 Eugenio Serrano
22/07/2004 - 17:44 | Informe spam
Debes implementar la interface IDisposable si es que no la ha implementado
ya tu clase base.
Busca IDispable en la ayuda de Visual Studio que hay un patron para
implementar tanto en tu clase que herede de una clase que a implementado
IDisposable como en una clase que lo implementa desde 0

Recuerda que es el CLR llama a Finalize y el programador no puede hacerlo de
forma deterministica
Saludos,
Eugenio Serrano
NDSoft Consultoria y Desarrollo
MS MVP ASP.Net
Instructor 3 estrella (DCE)
Voluntario Ineta Latam

"Jordi" escribió en el mensaje
news:1eb301c46fe4$f771e640$
Hola a todos, cómo estáis ?

Tengo un problema con un destructor. Es muy simple:

Tengo una clase llamada CConstantes con un constructor y
un destructor:

Public Sub New(masCst as string)
...
End Sub

Protected Overloads Overrides Sub Finalize()
MsgBox("Destructor Collection")
...
End Sub

Desde el programa principal, al hacer click sobre un botón:

Sub Click
Dim mloConstantes as New CContantes("Cadena")
...
End Sub

El problema es que al finalizar el ámbito del Click (End
Sub), NO me ejecuta el Destructor automáticamente (me lo
ejecuta automáticamente al finalizar la aplicación).

Cómo puedo crear un DESTRUCTOR, que al finalizar su ámbito
de uso, se ejecute automáticamente ? Lo he intentado con
Dispose y no hay manera.

Muchas gracias.
Respuesta Responder a este mensaje
#3 Guillermo guille
23/07/2004 - 03:04 | Informe spam
Pero el GC.Collect realmente funcionará si se ha asignado un valor nulo a las
variables, (ya que el método aún no ha terminado y los objetos siguen vivos) o
si vuelve a llamar al método, en cuyo caso el GC se encargará de recolectar los
objetos antes no recolectados.
Otra cosa es que se llame a otro método en el que se crean localmente los
objetos y después de llamar a ese método se haga una llamada a GC.Collect
(¡cuantas llamadas! je, je)

crearObjetos()
GC.Collect()
...
Private Sub crearObjetos()
Dim prueba1 As New Prueba("1 en crearObjetos")
'
TextBox1.Text = prueba1.Nombre
End Sub


Nos vemos.
Guillermo
Microsoft VB MVP desde 1997
Te invito a mi sitio dedicado al VB y más...
http://www.elguille.info/
http://www.mundoprogramacion.com/
(puede que el correo usado sea anti-spam)


"Pedro Luna Montalvo" wrote in message
news:ONmWRh$
Saludos:

Busca mayor informacion sobre el "Colector de Basura", "Garbage Collector",
y patrones de implementacion de "IDisposable" para que entiendas la
administracion de memoria de los objetos .NET.

La memoria de los objetos no es liberada de inmediato, necesariamente,
cuando los objetos no son referenciados por nadie. En su lugar, un proceso
de baja prioridad, precisamente el Colector de Basura, cada cierto tiempo, o
cuando el uso de memoria es elevado, liberara esta memoria.

El destructor de los objetos es invocado precisamente por el Colector, justo
antes de reclamar la memoria que utiliza, por eso es critico el tipo de
codigo que colocas ahi, para no bloquear el hilo del recolector.

El metodo Dispose, permite que tu objeto libere recursos criticos antes de
que el mismo sea destruido, es decir, que permites que el objeto libere los
recursos que esta usando, precisamente porque no tenemos certeza del tiempo
que transcurra hasta que se ejecute propiamente el destructor.

Si quieres que en algun momento el colector libere toda la memoria usada por
objetos fuera de ambito, puedes usar:

GC.Collect() ' Solicitar la recolección
GC.WaitForPendingFinalizers() ' Esperar a que se libere todo

Saludos
Pedro Luna, MVP
Gye, Ecu


"Jordi" escribió en el mensaje
news:1eb301c46fe4$f771e640$
Hola a todos, cómo estáis ?

Tengo un problema con un destructor. Es muy simple:

Tengo una clase llamada CConstantes con un constructor y
un destructor:

Public Sub New(masCst as string)
...
End Sub

Protected Overloads Overrides Sub Finalize()
MsgBox("Destructor Collection")
...
End Sub

Desde el programa principal, al hacer click sobre un botón:

Sub Click
Dim mloConstantes as New CContantes("Cadena")
...
End Sub

El problema es que al finalizar el ámbito del Click (End
Sub), NO me ejecuta el Destructor automáticamente (me lo
ejecuta automáticamente al finalizar la aplicación).

Cómo puedo crear un DESTRUCTOR, que al finalizar su ámbito
de uso, se ejecute automáticamente ? Lo he intentado con
Dispose y no hay manera.

Muchas gracias.




email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida