De l'utilité des "Set truc=Nothing"

De l'utilité des "Set truc=Nothing" - VB/VBA/VBS - Programmation

Marsh Posté le 13-01-2004 à 14:59:39    

Je fai de l'ASP en VBScript.
 
j'ai recupere du code existant et a la fin de chaque fonction les variables qui étaient déclarées au debut par "dim truc" sont "effacées" a la fin de la fonction par "Set truc=nothing".
 
je me demandai si ct vraiment obligatoire ?? c'est censé être un langage de haut niveau, il fait pas le ménage lui même ?


Message édité par Profil supprimé le 13-01-2004 à 15:39:31
Reply

Marsh Posté le 13-01-2004 à 14:59:39   

Reply

Marsh Posté le 13-01-2004 à 16:27:35    

le C++ est un langage de haut niveau egalement, il n'empeche qu'il faut tout de meme liberer les objets apres utilisation, en vb, c'est la meme chose, le Set MonObjet = nothing libere la memoire allouée à un objet. Sinon, en effet, implicitement VB libere l'objet lorsque l'on sort de son champs de visibilité (sortie de fonction ou procedure), mais ca, c'est la theorie :D, en pratique, il vaut mieux toujours liberer ce que l'on a alloué

Reply

Marsh Posté le 13-01-2004 à 16:31:56    

:jap:

Reply

Marsh Posté le 14-01-2004 à 13:32:02    

Non, c'est à la fois inutile et erroné.
 
Set truc = Nothing ne s'applique qu'aux OBJETS, pas aux variables.
Deplus, si l'objet en question contient une méthode ".close" ou ".dispose", il faut l'éxécuter en premier.
 
Pour des variables de types "normaux" (nombres, chaînes de caractères, et array et structs contenant ces types) le nothing est inutile, puisqu'il est éxécuté au moment où la référence est supprimée. (l'affectation à Nothing éxécute le destructeur de l'objet, or les types "simples" n'ont pas de destructeur, donc c'est superflu)

Reply

Marsh Posté le 14-01-2004 à 13:36:42    

MagicBuzz a écrit :

Non, c'est à la fois inutile et erroné.
 
Set truc = Nothing ne s'applique qu'aux OBJETS, pas aux variables.
Deplus, si l'objet en question contient une méthode ".close" ou ".dispose", il faut l'éxécuter en premier.
 
Pour des variables de types "normaux" (nombres, chaînes de caractères, et array et structs contenant ces types) le nothing est inutile, puisqu'il est éxécuté au moment où la référence est supprimée. (l'affectation à Nothing éxécute le destructeur de l'objet, or les types "simples" n'ont pas de destructeur, donc c'est superflu)


 
il est totalement impossible de faire un Set ... = nothing sur autre chose qu'un objet, ce n'est donc pas superflux, mais tout simplement impossible (Vb hurle au blaspheme au moment meme ou tu effleure la touche F5 :D)

Reply

Marsh Posté le 14-01-2004 à 13:37:46    

Ca dépends, si tu met pas "option explicit" au début, ça passe (en ASP et en VBS en tout cas, en VB chais pas, j'ai pas essayé :D)
Par contre, en ASP, je passe mes journée à virer ce genre de ligne du code parceque les stagiaires qui bossent avec moi c'est des gros gorets :D


Message édité par MagicBuzz le 14-01-2004 à 13:38:52
Reply

Marsh Posté le 14-01-2004 à 13:43:39    

MagicBuzz a écrit :

Ca dépends, si tu met pas "option explicit" au début, ça passe (en ASP et en VBS en tout cas, en VB chais pas, j'ai pas essayé :D)
Par contre, en ASP, je passe mes journée à virer ce genre de ligne du code parceque les stagiaires qui bossent avec moi c'est des gros gorets :D


 
bha en VB, sans option explicit, n'importe quelle variables non declarée est implicitement declarée en tant que Variant et donc un objet, donc pas de pb.. mais quand on veut(doit !!!! :D) faire propre, on declare tout, alors un set <variable_et_non_pas_objet> = <qquechose> ne marche pas  
 
Ceci dit, en VB pure en effet :D
 
L'option Explicit c'est bon, mangez-en !  :o  (comique de repetition inside  [:kilgoreweb] )

Reply

Marsh Posté le 14-01-2004 à 13:55:30    

En VBS/ASP, quand on met l'option explicit, on doit mettre un dim, mais on peut pas mettre de type, alors ça sert à rien :D

Reply

Marsh Posté le 14-01-2004 à 17:11:55    

ben ca évite des fautes de frappass :o


---------------
oui oui
Reply

Marsh Posté le 15-01-2004 à 13:38:15    

ixemul a écrit :

le C++ est un langage de haut niveau egalement, il n'empeche qu'il faut tout de meme liberer les objets apres utilisation, en vb, c'est la meme chose, le Set MonObjet = nothing libere la memoire allouée à un objet. Sinon, en effet, implicitement VB libere l'objet lorsque l'on sort de son champs de visibilité (sortie de fonction ou procedure), mais ca, c'est la theorie :D, en pratique, il vaut mieux toujours liberer ce que l'on a alloué


en pratique, faire "set MaVariable=nothing" à la fin d'une fonction ou dans un class_terminate est inutile, VB se démerde très bien tout seul [:spamafote]


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 15-01-2004 à 13:38:15   

Reply

Marsh Posté le 15-01-2004 à 13:40:38    

mareek a écrit :


en pratique, faire "set MaVariable=nothing" à la fin d'une fonction ou dans un class_terminate est inutile, VB se démerde très bien tout seul [:spamafote]


 
En pratique :D mais j'ai deja eu le cas d'objet ActiveX assez porcs pour poser problemes s'ils n'etaient pas libérés...  [:kilgoreweb]

Reply

Marsh Posté le 15-01-2004 à 13:41:35    

MagicBuzz a écrit :

En VBS/ASP, quand on met l'option explicit, on doit mettre un dim, mais on peut pas mettre de type, alors ça sert à rien :D


si, ça sert quand même.
Si tu fait une faute de frappe sur le nom de ta variable sans option explicit ("MaVariabIeDeLaMortQuiTue" au lieu de "MaVariableDeLaMortQuiTue" par ex.) VB va croire que c'est une nouvelle variable et tu va en chier comme un Russe pour débugger ton code.  
 
Franchement, faire du VB sans option explicit c'est suicidaire


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 15-01-2004 à 13:42:34    

Sauf dans certains cas, avec des objets contenant eux-même d'autres objets assychrones (OLEDB par exemple). Parfois VB n'arrive pas à détruire tout seul l'objet, car il utilise un destructeur générique qui ne fait que désaouler les ressources de l'objet, mais pas les threads fils. Le destructeur explicite (appelé avec set xx = nothing) contient normalement l'appel aux méthodes de désalocation des ressources imbriquées.

Reply

Marsh Posté le 15-01-2004 à 13:44:08    

MagicBuzz a écrit :

Sauf dans certains cas, avec des objets contenant eux-même d'autres objets assychrones (OLEDB par exemple). Parfois VB n'arrive pas à détruire tout seul l'objet, car il utilise un destructeur générique qui ne fait que désaouler les ressources de l'objet, mais pas les threads fils. Le destructeur explicite (appelé avec set xx = nothing) contient normalement l'appel aux méthodes de désalocation des ressources imbriquées.


OK
t'as des exemples précis d'objets qui posent problème ?


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 15-01-2004 à 13:51:35    

Le drivers ODBC pour Oracle livré avec la version 8.0.5 par exemple. Une fois sur deux, il va conserver la connection (ou pire, le recordset) ouvert en mémoire. Résultat, au bout de quelques heures d'utilisation, vous plantez la base qui est remplie de dead locks.

Reply

Marsh Posté le 15-01-2004 à 14:28:30    

Dans les object models un peu touffus t'as intérêt à gérer finement la gestion des ressources (chez nous par exemple [:kiki]).
 
Par exemple, je conseille fortement une fonction CleanUp avant de faire le Set Machin = Nothing histoire de ne pas avoir de surprise au moment du terminate lui-même.
 
De toute façon, mieux vaut ne jamais prendre le problème des ressources à la légère. Tu sais jamais dire à l'avance jusqu'à quel point ton projet est susceptible de gonfler.
 
Au pire si tu fais rien, ton application part en idle et reste en mémoire alors que tu voulais cliquer. Evitez si possible l'emploi du End [:joce]


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 15-01-2004 à 15:01:25    

Disons que si on écrit proprement le destructeur, le Set machin = Nothing suffit. En effet, le destructeur est censé, avant de se terminer, vérifier que tout les traîtements assynchrones sont bien finis, et toutes les ressources libérées.
 
Par exemple, imaginons un objet qui contient un tableau d'objets, son destructeur devra ressembler à ça :
 


sub destructeur()
    for i = lbound(Me.tab) to ubound(Me.tab)
        if isObject(Me.tab(i)) then
             Set Me.tab(i) = Nothing
        end if
    next
    Me.tab = null ' Ca par contre c'est rigoureusement inutile en VB c'est juste pour la beauté du geste :D
end sub

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed