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.
 

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.

Preguntas similares