Newsgroup: it.comp.lang.visual-basic
Titolo: VB.NET - Distruzione oggetto Form

Salve a tutti,
Inizialmente avevo capito che gli oggetti venivano rilasciati dal CLR ,
tramite il Garbage Collection (collezionista di
rifiuti) , a sua insindacabile volontà.
Ma dal momento della eliminazione da codice al rilascio dove stazionano gli
oggetti ?
Scoperta , nel garbage bin ( bidone dell'immondizia !) .
La mia maschera , costata settimane di studio ,lavoro , sudore , ecc. ;
gettata nel secchio dell'immondizia ; insieme a
chissà quali altri rifiuti.
Ho tentato in tutti i modi di evitare detto deposito , ma nulla da fare.
Infatti il test seguente:
'variabile a livello di modulo
Private f As Form1
'e il seguente codice:
 If f Is Nothing Then
            f = New Form1()
            f.MdiParent = Me
            f.Show()
        End If
Mi costruisce l'istanza solo se la maschera è Is Nothing , cioè rilasciata
definitivamente .
Se la chiudo non posso istanziarla di nuovo , per il compilatore non è
Nothing in quanto è presente nel bin .
Ho tentato con:
1- nell'evento Handles MyBase.Disposed
ho aggiunto  Me.Dispose() . Speravo in un rilascio in tempi brevi da parte
del Garbage Collection.  Nulla
2- Form1 = noting 'non accetta perchè non è stata istanziata
3- Tentativo estremo. Secondo MSDN da evitare.
Nell'evento Handles MyBase.Disposed
  GC.Collect()
        GC.WaitForPendingFinalizers()
Nulla.
Ho aspettato ore nella speranza che passasse il camion della nettezza
urbana. Nulla.
Diverso se si aggiunge la proprietà IsDisposed (indicatore di controllo
eliminato)
e modificando la prima riga di codice:
 If f Is Nothing OrElse f.IsDisposed Then
verrà rilevata la presenza della maschera nel bin e a video appare la form.
Viene da chiedersi , è un oggetto nuovo o il rifiuto pescato dal bin ?
giuseppeD

 ha scritto nel messaggio
news:if8d9.58175$pX1.1...@news2.tin.it...


 ripescata dal bin)
Sì, ma se io uso IsDisposed e la mia form è nel cestino, quindi non ancora
disposta, non rischio di usare un oggetto che in realtà sta per essere
distrutto da un momento all'altro?
Non dovrei risolvere il tutto anzichè
Set MyForm = Nothing
chiamando e così forzando la distruzione
MyForm.Dispose?
Ciao
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.it
"


Leggo da MSDN:
Common Language Runtime chiama il distruttore del componente dopo che la
procedura di Garbage Collection determina che non č
piů possibile raggiungere il componente mediante l'esecuzione del codice.
Questa situazione si verifica nel caso in cui tutti
i riferimenti al componente siano stati rilasciati o se gli unici
riferimenti al componente sono contenuti negli oggetti che
a loro volta risultano non raggiungibili mediante l'esecuzione del codice,
come nel caso dei riferimenti circolari.
Se ho capito un oggetto che per te č rilasciato e puň essere eliminato ,
invece per il Garbage Collection č in piedi qualche
riferimento e non lo elimina.
Con il metodo Dispose rilasci la risorsa e togli ogni dubbio al Garbage
Collector per la sua definitiva didtruzione.
Il problema si presenta per oggetti non implementati dal metodo Dispose.
Questa č una situazione che si rischia di avere un numero di istanze appese
, non utilizzate ma non eliminabili.
giuseppeD

 distrutto da un momento all'altro?
Quando chiudi con la X il form, questo viene automaticamente Disposto (metti
un breakpoint nella Dispose come verifica).
Quando un oggetto è Disposed, come indica MSDN, eventuali variabili che
facevano riferimento all'oggetto non possono essere riutilizzate per
ricrearne un istanza.
Quindi, l'oggetto è in memoria in attesa di essere recuperato dal GC, ma
quell'area di memoria, eventualmente utilizzata non è più accessibile.
