IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

Différence entre "IsEmpty" et "is nothing"


Sujet :

VBScript

  1. #1
    Invité
    Invité(e)
    Par défaut Différence entre "IsEmpty" et "is nothing"
    Bonjour

    Bon, ne m'insultez pas à cause de ma question, c'est une vraie question ^^ Je trouve tantôt des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsEmpty(var) then ...
    et tanttôt des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If var is nothing then ...
    et j'aimerai bien savoir quelle est la différence, dans quels cas utiliser l'un plutôt que l'autre etc.
    Mais c'est pas forcément une info facile à chercher (ce sont des mots trop courants) donc je m'adresse à vous ^^

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Normalement is nothing sert à tester si la variable est nulle.
    Et IsEmpty teste peut être si la variable est vide.
    Une variable peut elle être vide et non nulle ?
    Peut être dans le cas des collection qui ne contiennent aucun element.
    En même temps c'est la première fois que je vois IsEmpty. Cela ne pourrait pas être une fonction codé par quelqu'un et non une fonction existante par défaut en VBS ?
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  3. #3
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 294
    Points : 3 544
    Points
    3 544
    Par défaut
    salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If var is nothing then ...
    ce code n'a pas de sens (l'opérateur is n'existe pas en vbs)

    En même temps c'est la première fois que je vois IsEmpty. Cela ne pourrait pas être une fonction codé par quelqu'un et non une fonction existante par défaut en VBS ?
    si si, la fonction IsEmpty existe et sert à tester si une var a été initialisée
    le mot clé Nothing n'intervient que pour libérer explicitement une variable objet de la mémoire (set varobj=nothing)
    ça ne sert à rien sinon à faire joli ce qui n'est pas négligeable sauf dans des cas très particuliers (objets dao)
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses

    Donc si j'ai bien compris, en VBS, je dois bien utilsié IsEmpty pour tester si mes variables ont remplies ?
    En fait, je l'utilise pour savoir si mes objets sont initialisés ou non (dans une boucle par exemple ou pour tester le résultat de fonction (par exemple selectSingleNode qui ne renvoie pas d'erreur mais pas objet non plus quand elle ne trouve pas le noeud XML demandé)).
    Je ne savais pas que le "is" n'existait pas en VBS... Pourtant je n'obtiens pas d'erreur

  5. #5
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    si si, la fonction IsEmpty existe et sert à tester si une var a été initialisée
    le mot clé Nothing n'intervient que pour libérer explicitement une variable objet de la mémoire (set varobj=nothing)
    ça ne sert à rien sinon à faire joli ce qui n'est pas négligeable sauf dans des cas très particuliers (objets dao)
    Je crois avoir déjà fait :
    Et cela a marché si je l'ai bien fait, plus sur.

    Je me souvenais bien l'avoir déjà fait. Tiré d'un de mes scripts qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not (CurrentTest.Params Is Nothing)


    Edit :
    En même temps les deux codes suivant ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim toto
    If toto Is nothing Then
    	msgbox "Nothing is Nothing."
    Else
    	msgbox "If it's Something then it's not Nothing."
    End If
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim toto
    If toto = nothing Then
    	msgbox "Nothing is Nothing."
    Else
    	msgbox "If it's Something then it's not Nothing."
    End If
    Mais celui-ci si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim toto
    If IsEmpty(toto) Then
    	msgbox "Nothing is Nothing."
    Else
    	msgbox "If it's Something then it's not Nothing."
    End If
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je viens de faire un test moi aussi... Si on ne doit pas utilisé "is nothing" comment faire un test qui renverra vrai quand la variable vaut nothing ?
    Parce que ce code-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    dim oObjet
    set oObjet = CreateObject("Scripting.Dictionary")
    set oObjet = nothing
    if IsEmpty(oObjet) then
    	Response.Write "Nothing"
    else
    	Response.Write "Something"
    end if
    affiche "Something"...

    D'ailleurs, puisqu'on en parle, qu'est-ce qui se passe exactement quand on écrit "oObjet = nothing" ? Parce que dans le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    dim oObjet, oOtherObjet	
    set oObjet = CreateObject("Scripting.Dictionary")
    Response.Write oObjet.Count
     
    set oOtherObjet = oObjet
    Response.Write oObjet.Count
     
    set oOtherObjet = nothing
    Response.Write oObjet.Count
     
    set oObjet = nothing
    Response.Write oObjet.Count
    Il n'y a qu'au dernier test d'affichage de "oObjet.Count" que ça plante, alors que je me serais attendue à ce que ça plante après le "oOtherObjet = nothing"... Merci d'avance si vous pouvez m'éclairer un peu ^^
    En particulier, quand je fais une boucle sur un dictionnaire ou un tableau d'objet en instanciant à chaque tour l'objet courant dans une variable, est-ce que je dois faire un "set variable = nothing" à la fin de chaque tour ? Et si j'instancie un attribut d'une classe avec un objet passé à une fonction de la classe, dois-je faire un "set attribut = nothing" dans le destructeur de la classe ? (sachant que je souhaite conserver l'objet extérieur à la classe avec lequel j'ai initialisé l'attribut pour l'utiliser dans d'autres opérations)

  7. #7
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    je ne fait toto = nothing que lorsque je veux libérer les ressources et que je n'ai plus besoin du contenu de la variable.

    Alors vu le comportement (que je reproduis chez moi), et ma connaissance c++, je dirais que :

    1) set oOtherObjet = oObjet va faire que les pointeurs pointent sur le même objet. Pas de recopie.

    2) set oOtherObjet = nothing ne supprime pas l'objet, mais supprime le lien entre le pointeur et l'objet. (on vide la case mémoire du pointeur qui contient l'adresse mémoire de l'objet)
    oObjet existe encore.

    3) set oObjet = nothing ton pointeur ne pointe sur rien donc cela plante.

    Après je ne sais pas si l'éditeur VBS à un "garbage collector" car si ce n'est pas le cas, après un set toto = objet.
    Faire un set toto = nothing ou non ne libère pas les ressources.
    Dans ce cas le set toto = nothing, ne te sert qu'à "dépointer" ton pointeur pour pouvoir le réutiliser !!!
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Oui, ce que tu décris est comme ce qui se passe en Java, tant qu'un objet est référencé, il reste en mémoire, quand il ne l'est plus, le garbage collector s'en occupe.
    Mais je ne sais pas comment fonctionne VBS à ce niveau, est-ce qu'il fait pareil ? J'ai lu dans plusieurs tutos sur le VBS (quand j'ai commencé à en faire) "Pensez à bien libérer la mémoire avec "= nothing" quand vous n'avez plus besoin de vos objets", ce qui me laisse redouter que le VBS ne gère pas la mémoire seul... D'où mon interrogation ^^

  9. #9
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Bah tu as un interpréteur pour lire le code et l'exécuter.
    Il lit ligne par ligne.
    Donc il sait quelles sont les instances qui sont encore affecté à une variable.
    Donc il est possible qu'il néttoie la mémoire au moment où l'on enlève la dernière référence sur l'instance ou la valeur.

    Cela me parait correcte comme fonctionnement mais je reste dans l'hypothètique car je n'ai pas l'information. Je ne fait que déduire le fonctionnement des choses.
    Et comme ce soir j'ai pas le courage de chercher comment la mémoire est gérer en VBS ....
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ced600 Voir le message
    mais je reste dans l'hypothètique car je n'ai pas l'information. Je ne fait que déduire le fonctionnement des choses.
    Et comme ce soir j'ai pas le courage de chercher comment la mémoire est gérer en VBS ....
    Oui, oui, je te demandais pas à toi personnellement de chercher
    Je me disais que peut-être que quelqu'un connaissant bien le VBS et passant par là saurait répondre :p

  11. #11
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 294
    Points : 3 544
    Points
    3 544
    Par défaut
    ce code n'a pas de sens (l'opérateur is n'existe pas en vbs)
    héhé boulette... ça m'apprendra à répondre de mémoire
    maintenant, pour toutes les questions existentielles concernant les valeurs spéciales gérées par vbs,
    un petit tour sur le blog du papa du vbs himself ? :
    http://blogs.msdn.com/ericlippert/ar.../30/53120.aspx
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  12. #12
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Oh, merci pour ce lien (même si l'anglais c'est dur, mais ça s'arrange au fur et à mesure que je lis ) !
    Donc il n'existe pas de test pour dire "est-ce que c'est un objet initialisé ?" il faut voir si "not IsEmpty(toto)" et si "not toto is nothing" !

  14. #14
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Citation Envoyé par Laewella Voir le message
    Oh, merci pour ce lien (même si l'anglais c'est dur, mais ça s'arrange au fur et à mesure que je lis ) !
    Donc il n'existe pas de test pour dire "est-ce que c'est un objet initialisé ?" il faut voir si "not IsEmpty(toto)" et si "not toto is nothing" !
    IsEmpty test si la variable est initialisé ou non.
    Is Nothing test si la variable est une référence sur un objet.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Différence entre %STR et %QUOTE
    Par fafabzh6 dans le forum Macro
    Réponses: 10
    Dernier message: 14/03/2011, 18h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo