Newsgroup: it.comp.lang.visual-basic
Titolo: [?] With e Reference Count

C'è una cosa di VB che mi ha lasciato letteralmente a bocca aperta, a mio
giudizio puo' essere fonte di molti casini sopratutto se si una il costrutto
With...End With in modo intensivo (e con exit sub e/o gestione dell'errore).
Il brano l'ho trovato su 
http://vbaccelerator.com
 (sezione headlines)
The With statement in VB is a nice language feature which can make code
easier to write and maintain. However, there's a big catch to it, pointed
out in an article by Dave Jewell in the UK magazine PC Pro.
When you use With to refer to an object, VB will call the COM AddRef method
on the object. Only when the End With statement is reached is COM's Release
method called. This means that if you're code breaks out of a With...End
With statement block for any reason, VB will have taken out a permanent
reference on that object. Objects cannot clear up properly unless there are
no outstanding references on them or when your executable terminates!
Voi cosa ne pensate ?
Ciao
CiRcLeMaster
http://www.arlequine.com/circle

Con With, Vb crea una variabile nascosta e la usa per accedere i vari
elementi presenti tra With/End With.
La variabile ha peró visibilitá locale (non é global) perció cessa di
esistere non appena il codice abbandona la Sub/Fn/Property dove With é stato
usato. Di conseguenza il riferimento cessa di esistere.
Ciao,
Corrado


Si lo so, probabilmente non era chiaro il senso del mio post.
Il senso dell'articolo è diverso. Questo è quello che ho capito io:
Se tutto va bene, end with fa la release del riferimento e se il reference
count va a 0 l'oggetto è deallocato.
Ma se la end with non viene eseguita... (leggendo l'articolo un motivo per
cui non viene eseguita è che viene lanciata una eccezione, ma si potrebbe
anche pensare ad un exit sub)... la release non viene eseguita e quindi il
reference count non viene decrementato e quindi sembrerebbe che l'oggetto
non venga deallocato fino a quando l'applicazione non è terminata. Questa
cosa se fosse vera significa che probabilmente l'oggetto implicitamente
creato da with non viene creato nello stack senno' verrebbe distrutto
comunque all'uscita della function/sub
La pulce nell'orecchio me l'ha messa la frase "...VB will have taken out a
permanent reference on that object...".
Per contro, nel reference di VB c'è scritto:
"Note   In general, it's recommended that you don't jump into or out of With
blocks. If statements in a With block are executed, but either the With or
End With statement is not executed, a temporary variable containing a
reference to the object remains in memory until you exit the procedure."
Dove quello che tu hai detto viene confermato, cioè all'uscita del with
l'oggetto viene distrutto
Quindi, potrei aver interpretato male la lettura del primo articolo e volevo
discuterne un po'.
Ciao
CiRcLeMaster
http://www.arlequine.com/circle

Dopo un po' di prove mi sono risposto da solo.
Ho interpretato male l'articolo, effettivamente il riferimento viene
distrutto all'uscita della sub/function.
Pero' si presenta un problema all'interno della sub (a qualcuno puo' tornare
utile saperlo, per me lo è stato)
Dim c As Class1
Private Sub A()
    Set c = New Class1
    dotask
End Sub
Sub dotask()
    With c
        .....
        ......
        if condition then GoTo exittask
    End With
    Set c = Nothing                     '  E' VERO !!!!!!!
    Exit Sub
exittask:
    Set c = Nothing                     '  NON E' VERO !
End Sub
Ciao
CiRcLeMaster
http://www.arlequine.com/circle