Newsgroup: it.comp.lang.visual-basic
Titolo: Classi com'è meglio?

Scrivendo Dim Sfum As New clsSfum
la classe mi funziona in tutto il form(modulo)
Ma ho imparato a scrivere:
Private Sfum as New clsSfum
poi nell'evento Load: Set Sfum = New clsSfum
e poi in Unload: Set Sfum= Nothing
Come č meglio comportarsi? E' un discorso di risorse utilizzate oppure č lo
stesso?
Grazie
--
Gulp
....forse mi sono perso qualcosa !

Sono due cose diverse ... e tutto dipende da cosa
devi fare.
Quando usi la parola chiave new associata alla dichiarazione
variabile, crei contemporaneamente l'oggetto e ne
istanzi la classe base, ovvero allochi già le risorse previste
per l'oggetto stesso.
Con il secondo metodo invece, ti crei una variabile di
interfaccia, quindi dello stesso tipo, dell'oggetto ma non
istanzi l'oggetto stesso.
Succede quindi che la tua variabile ti permetterà di vedere
tramite intellisense metodi e proprietà, ti permetterà anche
(a seconda dell'oggetto di cui parliamo) di usare alcune
proprietà per impostare per esempio dei valori di default,
ma non ti lascierà utilizzare alcuna funzione o metodo
della classe stessa.
Esempio
dim x as new adodb.recordset
x.open .... (va bene - la variabile è già istanziata)
dim x as adodb.recordset
x.connectionstring = .....
x.open (fallisce - perchè non è ancora stato creato l'oggetto).
hth
Andrea

 stesso?
Il discorso è che facendo
Dim Sfum As New clsSfum
VB instanzia la classe ogni volta che ci si accede, cioè puoi fare una cosa
del genere:
' mettiamo che clsSfum abbia la proprietà X numerica
Sfum.X = 10
Set Sfum = Nothing
Debug.Print Sfum.X
L'ultima anzichè darti il corretto errore 91 (variabile oggetto non
impostata) ti darà 0, perchè VB avrà reinstanziato la classe.
Questa cosa è pericolosissima, perchè apparentemente è un aiuto, ma in
realtà perdi il controllo del codice e ti troveresti a cercare di capire
perchè X vale zero se era appena stata valorizzata, o perchè Sfum non è
nothing...
immagina se le tre righe sopra fossero sparse per il codice di un progetto
di medie dimensioni...
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 del genere:
osservazione molto preziosa !
Non lo sapevo .... anzi, pensavo che l'istanziazione automatica si
verificasse soltanto per la prima occorrenza (ossia quando il codice
incontra la var. solo per la prima volta).
D'ora in poi sostituirò tutte le istanze create dinamicamente con dim ... as
new   con   set ...= new.
Grande Zanna !
ciao
Soviet


 osservazione molto preziosa !
Precisazione.
In 
vb.net
 le due forme
Dim x As New Classe
e
Dim x As Classe
x = New Classe
Corrispondono, e per fortuna corrispondono alla seconda.
Questo perchč cosě viene reso possibile in modo inequivocabile
l'assegnamento "in-line"
Dim x As New Classe
Dim x As Classe = New Classe
Sono ancora corrispondenti.


per l'oggetto stesso.
Mica vero. Dalla documentazione in linea - che ricordavo a stento e
che ho dovuto rivedere - , nella pagina 'Dim statement:
[New] Optional. Keyword that enables implicit creation of an object.
If you use New when declaring the object variable, a new instance of
the object is created on first reference to it, so you don't have to
use the Set statement to assign the object reference 
Ciao!
Luca 

Set Sfum= Nothing
In effetti e' quel che piace piu' anche a me, almeno so sempre quello
che sto facendo e, se sbaglio, almeno so dov'e'.
Pero' ci sono situazioni - tipo: oggetti persistenti per tutta la
durata dell'applicazione - dove la dichiarazione alternativa e'
mooooolto comoda.
Ciao!
Luca

mmmm .... leggo leggo ...
ok ... accetto l'errore ... ma mi trovo meglio con il secondo
metodo anche io ...
Ciao
Andrea

 mooooolto comoda.
Personalmente uso la versione "in-line" solo per fare dei test velocissimi
(risparmio quei 3/4 sec. di scrittura :P )
Puň essere una scusante il fatto di non avere dati sensibili nella classe,
che cioč se perdi tutto durante una messa a Nothing, la prossima volta che
la classe viene instanziata il suo contenuto sia comunque "congruente".
Perň poi sorgerebbe  il dubbio "ho scritto cosě per fare in fretta o perchč
volevo proprio scrivere cosě?" e questi pensieri sono tra i peggiori nemici
di un programmatore :)
Ciao