Newsgroup: it.comp.lang.visual-basic
Titolo: Garbage collector in VB6 e .Net

Una discussione pseudo-filosofica con un collega ha scatenato in 
me strani dubbi... mi hanno sempre insegnato a diffidare del GC 
automatico di VB6, e a deallocare tutti gli oggetti una volta 
esaurito il loro compito, e lui se ne esce bel bello dicendo '...
ma con .Net il problema non si pone! C'e' un thread a bassa 
priorita' che gira in background, e che si occupa di recuperare 
risorse all'occorrenza.'
Questo vuol dire che con .Net non dovremo piu' preoccuparci delle 
risorse a disposizione, ma istanziare oggetti a piacere, tanto 
una volta usciti dal loro scope verranno marcati come 'garbage'?
Mah...
Bye by SixaM 8-]
--
Bye by SixaM 8-]
Inviato da 
www.mynewsgate.net

 una volta usciti dal loro scope verranno marcati come 'garbage'?
Come con VB6 :)
Il problema è che il "thread" di .NET proprio perchè lavora 
separatamente dal processo principale (techicamente chiamato "garbage 
collector non deterministico", che vuol dire che non si può determinare 
quando l'oggetto viene rilasciata) puoi rischiare di utilizzare un 
oggetto che in realtà non è nothing e a metà del lavoro lo diventa (e ti 
lascio immaginare cosa può succedere).
Quindi, o sai bene cosa stai facendo o anche se non strettamente 
necessario ti continui a mettere tutte le var = Nothing
Ciao

 Ciao
ciao
--
.A
UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org
Read my blog at: 
http://www.ugidotnet.org/4.blog

 Bye by SixaM 8-]
ciao,
--
.A    [Microsoft MVP .NET]


 raggiungibili (quindi non + utilizzabili) dall'applicazione.
Quel poco che mi ricordo da un test che avevo fatto è che puoi 
tranquillamente fare
Dim Form1 As Form
Form1.ShowModal
Form1.Dispose
' ...qualche altra cosa...
str = Form1.Text ' Se ti va bene Form1 è ancora "vivo", se il GC è già 	
		 ' passato di qui Form1 comunque non è Nothing, ma è
		 ' ugualmente inaccessibile
Cioè non puoi fare un test del tipo
Form1.ShowModal
Form1.Dispose
' ...qualche altra cosa...
if (Form1 = Nothing) then
	str = Form1.Text
end if
Ciao

 end if
beh, ma in questo caso non č stato il garbage collector a "disposare"
l'oggetto: č stato esplicitamente richiamato il metodo dispose.
mi sembrano discorsi alquanto differenti.
--
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 ' ugualmente inaccessibile
Idee un po' confuse:
1) chiami il metodo Dispose solo se sei SICURO di non utilizzare più
quell'elemento!
2) Form1 normalmente non sarà un'instanza globale come in vb6, ma sarai
costretto a defnire variabili di tipo Form1 pertanto non sarà così facile
"Disporre" da qualche parte una form e utilizzarla ancora successivamente.
:-)
3) Se fai FormX.Dispose scordati di poter ancora accedere al Text1 perché
(fa parte del codice autogenerato) Text1 viene "disposto" con la form.
4) Se lasci "morire" la tua form in santa pace questa occuperà un po' di
risorse del sistema ancora per un po', ma chissenefrega, per cui se non sei
più che sicuro lascia che sia il garbage collector a chiamare il metodo
dispose (anche se questo rallenta effettivamente il rilascio delle risorse).
:-))
...e per finire...
Riguardo al "Come in VB6 :)"
Direi come in VB6 puoi ignorare come funzioni il meccanismo di GC e lavorare
tranquillamente, ma di uguale non c'é niente (ad iniziare che il meccanismo
non é più basato sul reference counter, ma non so su quale diavoleria (TM)).
:-)
    Ciao
        Allanon
-- 
- SPAMKILLER
 lasciate il NOSPAM nell'indirizzo: 
itlangv...@michele.sytes.net
 e lasciate la parola SPAMKILLER nel corpo dell'email

 nothing ma è disposto (verrà messo a nothing più tardi dal GC?)
No, il GC non lo imposta a Nothing perché il GC non "eliminerà"
definitivamente il form finché questo riferimento (o altri) esiste. Il GC
non imposta Form1 a Nothing e l'impostazione di Form1 a Nothing che permette
al GC di "magnarsi" Form1.
Il metodo Dispose libera delle risorse, ma come hai detto tu non tutte.
Quando non ci sono più riferimenti che puntano al tuo Form il GC dapprima
chiama un eventuale metodo Dispose e dappoi il metodo Finalize (se non
sbaglio protected overridable ereditato da System.Object)
    Ciao
        Allanon :-)


Dunque,
Innanzitutto non mi risulta che VB6 abbia mai avuto un garbage collector, ma
bensi la distruzione di un oggetto avviene attraverso l'arcinoto reference
counting di COM (e relativa IUnknown con le famose AddRef e Release...) il
quale pur avendo il pregio di fornirci la distruzione deterministica di un
oggetto di contro ha il difetto legato alle dolenti Circular References.
Come e' noto, con il Garbage Collector si perde l'aspetto deterministico e
per sopperire a questo e' stato introdotto il pattern Dispose, questo pero'
non significa che per rilasciare un riferimento ad un oggetto sia necessario
invocarne il metodo Dispose ma solo che alcuni oggetti richiedono che le
risorse associate (vedi ad esempio un handle ad una risorsa GDI+, oppure ad
una risorsa hardware) debbano essere rilasciate non appena non servono piu'
e questo significa prima che il garbage collector intervenga e quindi
invochi il distruttore della classe (Protected Finalize in VB) e poi rilasci
l'oggetto dalla memoria.
Ricordiamoci che il garbage collector, se ha memoria sufficiente potrebbe
non intervenire mai...
Nel tuo esempio, e come cita MSDN:
Form.Dispose
Disposes of the resources (other than memory) used by the Form.
Come vedi fa riferimento alle risorse GDI del form e non alla spazio dati
del form
Considera questo esempio:
Dim f As New Form1
f.ShowDialog()
f.Dispose()
Dim i As IntPtr = f.Handle '// errore
GC.Collect()   '// Forzo l'intervento del Garbage collector
Dim s As String = f.Text '// Non uso risorse del form, quindi ok...
Dim b As Boolean= f.IsDisposed            '// True
f = Nothing
GC.Collect()
s = f.Text        '// Errore
Con f.Dispose rilascio tutte le risorse 'grafiche' associate al form, lo
conferma il fatto che f non ha piu' un hWnd (handle) associato,
pero' pur invocando l'intervento del garbage collector (GC.Collect) posso
comunque accedere all'area dati nella managed memory usando f.Text perche'
il GC sa che l'oggetto e' ancora referenziato, infatti, rimuovendo il
reference e riforzando l'intervento del GC la successiva f.Text fallisce.
IsDisposed e' stato aggiunto proprio per capire quando un form non ha le
relative risorse associate.
A proposito ma il metodo ShowModal dove arriva?
HTH
-- 
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - 
http://www.ugidotnet.org
Weblog: 
http://www.ugidotnet.org/710.blog

 A proposito ma il metodo ShowModal dove arriva?
in che senso?
afaik arriva dalla documentazione di vb.net...


 Sergio
--
.A    [Microsoft MVP .NET]


 chiama ShowDialog....
vero... il solito annodamento (mio) fra vb6 e .net
beh, però, potremmo sempre ereditare da form e aggiungere ShowModal :-)


 relative risorse associate.
Con  f.Dispose,
il GC sposta l'istanza nella managed memory,
rilascio tutte le risorse,
ma l'oggetto è ancora referenziato.
Quando il GC deciderà, distruggerà l'istanza.
Se uso f=Nothing
Il GC sposta l'istanza nella managed memory,
rilascio tutte le risorse,
l'oggetto non è più referenziato, ma è presente nella memoria managed heap,
Quando il GC deciderà, distruggerà l'istanza.
E' corretto ?
Ave
giuseppeD

 
Da Delphi :P
Ciao

 E' corretto ?
Non proprio... ;-)
